如何通过空格或逗号分割字符串?

158

如果我尝试

"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
7个回答

309

String.split() 方法还可以接受一个正则表达式:

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

这个正则表达式会根据一个或多个逗号或空格的序列来分隔字符串,这意味着例如多个连续的空格或逗号+空格序列不会在结果中产生空元素。


4
@Bergi: 好吧,它比我建议的更加严格(只允许一个逗号在前面),并且比OP要求的更加松散(分割所有空格)。依我看,这将会更糟糕--考虑输入spaces , before commas - Jon
@Jon:好的,那取决于原帖作者的需求。我不会乱建议 :-) - Bergi
16
我知道这可能有点过时了,但为什么要使用空格而不是\s呢?因为blob中可能会有一些换行符,而\s也可以处理这些情况。 - iambriansreed
8
面掌注:不要在正则表达式周围加引号。例如,不要使用input.split("/[ ,]+/")。省略引号(使用input.split(//)而不是input.split("//")),您会获得更好的体验。因为奇怪的是,那只有可能对它本身有效(生成["input.split(\"", ")\""])。 - cod3monk3y
input.split(/[ ,]+/); - Nicholas M T Elliott
它还会从输入的开头和结尾删除空字符串:' ,my, tags, are, here,'.replace(/[\s,]+/g, ' ').trim().split(' ') - Ghominejad

64

你可以使用正则表达式来捕获任何长度的空格,示例代码如下:

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" 

7
在使用/\s+/时要注意前后空格。例如,'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]。如果您先使用.trim()函数去除字符串的前后空格,就可以避免这个问题。 - Jordan Dodson

47

使用.split(/[ ,]+/)的建议很好,但是在处理自然语言句子时,最终你会得到空元素的数组,例如:['foo', '', 'bar']

如果这符合你的使用情况,那么就没问题了。但是如果你想去掉空元素,可以这样做:

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

6
这是一种非常巧妙地使用本地对象隐式构造函数的方式。我电脑的键盘今天有些故障,稍后我会编辑这个评论。但是重点是,像'Boolean()'这样调用将构造一个具有false值的新[object Boolean]实例,就像调用'new Boolean()'一样。 这将过滤掉所有匹配项并将其减少到此默认行为。不错 :) - VLostBoy
“自然语句”是什么意思?我无法模拟它,也不理解它的作用。 - cregox
1
这是由@VLostBoy解释的。当在任何值上调用Boolean()构造函数时,它会将该值转换为布尔值 - true或false。因此,任何假值都将从数组中过滤掉,包括空字符串。 - jonschlinkert
1
顺便提一下,你可以使用隐式构造函数来处理其他类似的有趣事情,比如 [1, 2, 3].map(String) - jonschlinkert
处理其他类型的空格(包括换行符):val.split(/[\s,]+/).filter(Boolean) - Adam Fraser
3
"foo, bar,,foobar,".split(/[\s,]+/) 返回 ["foo", "bar", "foobar", ""](因为末尾有一个悬挂逗号),谢谢! - Rafał Cieślak

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

结果是:

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

12

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

这段代码使用正则表达式 /\s*[\s,]\s*/ 进行字符串分割。

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

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


它似乎在每个字符上进行分割。 - Marco
@Marco 哎呀,最后一次编辑之前应该先测试一下的。现在我已经测试过了,这次应该真的可以工作了。 - KaptajnKold
2
@KaptajnKold 哦,我没听清楚,谢谢你的回答! - Rafał Cieślak
test test is resulting in ["t", "", "e", "", "s", "", "t", " ", "t", "", "e", "", "s", "", "t"] - leonheess
1
@leonheess,很抱歉得承认你是对的。我已经移除了答案中错误的部分,唉!这个回答不算是我最好的工作。我真的应该学会测试代码。 - KaptajnKold
显示剩余3条评论

2

当我想考虑额外字符,比如逗号(在我的情况下,每个标记可能用引号输入),我会使用string.replace()将其他分隔符更改为空格,然后按空格拆分。


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ') - qräbnö

1
当您需要使用某些单字符分隔符拆分字符串时,请考虑使用反向逻辑:匹配由除分隔符字符以外的字符组成的字符串块。
因此,要提取除空格(与 \ s 匹配)和逗号以外的所有字符块,可以使用

console.log("my, tags are, in here".match(/[^\s,]+/g))
// => ["my","tags","are","in","here"]

请查看正则表达式演示String#match 提取除空格和逗号([^\s,])之外的一个或多个字符(+)的所有非重叠出现。


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