如何用空格或逗号分割JavaScript字符串?


123

如果我尝试

"my, tags are, in here".split(" ,")

我得到以下

[ 'my, tags are, in here' ]

我想

['my', 'tags', 'are', 'in', 'here']

4
你不是在说空格逗号吗?
KaptajnKold

1
作为对所得结果的解释:"my, tags are, in here".split(" ,")仅在空格后跟逗号作为分隔符的情况下才拆分字符串。您的字符串不包含该序列,因此不会拆分。 "my, tags are, in here".split(", ")交换分割顺序后,在每个逗号和空格之后,至少会将您的原始字符串分成三部分。如果确实需要五个部分,则以下答案将匹配字符串指定为与空格逗号匹配的正则表达式。
Jochem Schulenklopper

Answers:


233

String.split 也可以接受正则表达式:

input.split(/[ ,]+/);

此特定的正则表达式在一个或多个逗号或空格的序列上拆分,因此,例如多个连续空格或逗号+空格序列不会在结果中产生空元素。


22
/,?\s+/
Bergi 2012年

4
@Bergi:好吧,它比我建议的要严格(在前面只允许一个逗号),也比OP要求的要宽松(在所有空白处分隔)。恕我直言,这只会更糟-考虑一下输入spaces , before commas
2012年

@Jon:好的,这取决于OP的需求。我不会plenk :-)
Bergi'4

11
+1我知道这有点旧,但为什么不使用空格呢\s?我可能在Blob中有一些换行符,也要\s注意这些换行符。
iambriansreed 2012年

6
FACEPALM注意:请勿在正则表达式两边加上引号。例如不要使用input.split("/[ ,]+/)"。省略引号(input.split(//)而不是input.split("//")),您将获得更好的体验。因为奇怪的是,那实际上可能仅对自身起作用(生成["input.split(\"", ")\""])。
cod3monk3y

41

使用的建议.split(/[ ,]+/)很好,但是使用自然句子迟早会导致数组中出现空元素。例如['foo', '', 'bar']

如果您的用例可以,那很好。但是,如果要摆脱空元素,可以执行以下操作:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

6
那就是对本机对象隐式构造函数的非常巧妙的使用-今天早上我的电脑键盘很生气-我稍后再编辑此注释-但要点是像'Boolean()'这样调用Boolean会使用一个新的[object Boolean]实例值false,就像调用“ new Boolean()”一样。这将过滤掉所有符合此默认行为的匹配项。好人:)
VLostBoy 2014年

您所说的“自然句子”到底是什么意思?我无法模仿它,也不知道这应该做什么。
cregox

@VLostBoy对此进行了解释。当Boolean()在任何值上调用构造函数时,它将该值转换为布尔值-true或false。因此,所有伪造的值都会从数组中过滤掉,包括空字符串。
jonschlinkert

1
顺便说一句,您可以将隐式构造函数用于其他类似的有趣事物,例如[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)返回["foo", "bar", "foobar", ""](由于末尾是悬空的逗号),谢谢!
拉斐尔·西拉克(RafałCieślak),

37

您可以使用regex来捕获任意长度的空格,这就像:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 

使用时请注意前导/尾随空格/\s+/。例如,'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]。如果您先.trim()输入字符串,那将会很好。
乔丹·多德森

12
"my, tags are, in here".split(/[ ,]+/)

结果是:

["my", "tags", "are", "in", "here"]

4

input.split(/\s*[\s,]\s*/)

\s*匹配零个或多个空格字符(不仅是空格,还包括制表符和换行符)。

... [\s,]匹配一个空格字符或一个逗号

如果您想避免输入像这样的空白元素"foo,bar,,foobar",那么就可以做到这一点:

input.split(/(\s*,?\s*)+/)

所述+匹配的一个或多个前面的字符或基团。

编辑:

?在与零或一个逗号匹配的逗号后添加。

编辑2:

原来编辑1是一个错误。解决它。现在,表达式必须至少有一个逗号或一个空格才能找到匹配项。


没事 这不好。这是输出:[“ my”,“ tags”,“ in here”]
gabitzish 2012年

它似乎在每个字符上分裂。
Marco

@Marco糟糕。在进行最后的编辑之前,可能应该已经对其进行了测试。我现在有,这一次确实应该工作。
KaptajnKold,2013年

嗯,这比公认的答案好吗?"foo,bar,foobar".split(/[ ,]+/)也返回["foo", "bar", "foobar"]
拉斐尔·西埃拉克(RafałCieślak),

1
@KaptajnKold哦,我没听清楚,谢谢您的回答!
拉斐尔·西耶拉克

2

当我想考虑诸如逗号之类的多余字符(在我的情况下,每个标记都可能用引号输入)时,我会执行string.replace()来将其他定界符更改为空格,然后在空白处进行分割。


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
–qräbnö
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.