如何在JavaScript中获取指定字符之前的子字符串?

386
我试图在JavaScript或jQuery中提取逗号之前的所有内容。我尝试了以下代码但不起作用。
1345 albany street, Bellevue WA 42344

我只想获取街道地址。

var streetaddress= substr(addy, 0, index(addy, '.')); 

53
addy.split(',', 1)[0] 的翻译是:以逗号为分隔符对 addy 进行拆分,只返回第一个元素。 - antak
12个回答

576
const streetAddress = addy.substring(0, addy.indexOf(","));

虽然它不是关于每个方法的明确信息的最佳来源(MDN Web Docs更好),但W3Schools.com很适合介绍语法。


40
如果被搜索的字符串中没有包含要查找的字符,那么这个方法将无法执行,它会返回一个空字符串。 - David G
13
不建议使用substr,应该使用substring。参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substring - Ben Creasy

251
var streetaddress = addy.split(',')[0];

17
摇摆和旋转 - 这不必要地创建了一个数组,但如果停止字符不在字符串中,则至少可以工作。 - Alnitak
2
有关性能比较,请参见:https://jsperf.com/street-array-vs-substr - Blue
6
之前的评论链接已失效 :/ - elki42
正如@Alnitak所提到的,如果停止字符不在字符串中,则此选项最佳。 - Yannick T.
5
考虑 addy.split(",", 1)[0],它在第一次出现 "," 后停止分割。 - Sebastian Simon

47

尝试这个:

streetaddress.substring(0, streetaddress.indexOf(','));

2
为什么没有人喜欢我的答案?如果这个回答是正确的https://dev59.com/f2865IYBdhLWcg3wkfgW,那么我的答案和被接受的答案一样准确,并且适用于起始索引不为0的情况。 - Mikey G
12
正如David G所指出的那样,可能是因为没有逗号导致代码无法工作。虽然OP(原帖作者)可能暗示该字符串总是有逗号,但在许多情况下分隔符并不被保证。详见https://jsfiddle.net/13pkp1xn/。 - Bumptious Q Bangwhistle

41
//split string into an array and grab the first item

var streetaddress = addy.split(',')[0];

另外,我建议您使用驼峰命名法(streetAddress)来命名变量,以提高可读性。


在没有逗号字符的情况下,这种方法比使用indexof更好。 - eyal_katz
5
您可以使用@antak在https://dev59.com/dmox5IYBdhLWcg3wjE5i#22386366中发布的评论所提供的方法 addy.split(',', 1)[0],在第一个逗号处停止分割,从而节省一些处理时间。请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split。 - flu
使用数组解构,您可以这样做:const [streetAddress,] = addy.split(',');当您想要多个值时,这非常有用,例如:let [callerIdName, callerId] = callerIdString.split('<');(原始callerIdString格式为MCMULLIN,PARKER <+1XXXXXXXXXX>) - parker_codes
4
这个答案难道不与于2015年10月30日发布的答案完全相同吗? - kojow7

22

如果您喜欢简短的话,可以使用RegExp

var streetAddress = /[^,]*/.exec(addy)[0];

4
+1,我认为这是一个合理的方法,但我从中得到了灵感,并选择了addy.split(',', 1)[0] - antak
3
如果你想按空格分割,那么这个方法非常好用:/[^\s]*/.exec(...)。 - NuSkooler
当要删除的子字符串并不一定存在时:streetAddress = addy.replace(/,.*$/, '');,这将仅在第一个匹配项(,)存在时才删除其后的所有内容。 - miile7

21

2
使用[0]进行索引比使用.shift()更高效。 - MysteryPancake
警告:如果输入字符串不包含逗号,则整个字符串将被返回。 - izogfif

13

和David G的答案几乎一样,但没有匿名函数,如果您不想包含一个匿名函数。

s = s.substr(0, s.indexOf(',') === -1 ? s.length : s.indexOf(','));

在这种情况下,我们利用了substr的第二个参数是长度的事实,并且我们知道我们的子字符串从0开始。

顶部的答案不是通用解决方案,因为如果字符串中没有您要查找的字符,则会出现不良行为。

如果您想在通用情况下获得正确的行为,请使用此方法或David G的方法,而不是顶部的答案。

正则表达式和分割方法也可以工作,但对于这个特定问题来说可能有点慢/杀鸡焉用牛刀。


9
var newString = string.substr(0,string.indexOf(','));

8

2

如果您希望在原始字符串不包含搜索字符时返回未更改的字符串,则可以使用匿名函数(闭包):

var streetaddress=(function(s){var i=s.indexOf(',');
   return i==-1 ? s : s.substr(0,i);})(addy);

这可以更加通用化:

var streetaddress=(function(s,c){var i=s.indexOf(c);
   return i==-1 ? s : s.substr(0,i);})(addy,',');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接