javascript正则表达式拆分产生太多项目

时间:2013-07-07 20:25:13

标签: javascript regex split

我正在尝试使用逗号或空格分割字符串。逗号可以选择在空格之前和/或之后,空格本身也可以作为分隔符。代码如下所示:

var answers= s.split(/(\s*,\s*)|\s+/);

如果s包含字符串'a b,c',我会得到一个包含五个项目的列表(数组),而不是预期的三个项目:

  

0:a,1:undefined,2:b,3:,, 4:c

对于我做错的任何建议都将不胜感激。

菲利普

4 个答案:

答案 0 :(得分:9)

那是因为split也将capturing groups推送到结果数组:

  

如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。

ab之间的空格与空白相匹配,因此捕获组未定义。 bc之间的逗号与组匹配,因此它成为数组中的第四项。

要解决此问题,只需删除捕获组:

var answers = s.split(/\s*,\s*|\s+/);

如果你有一个更复杂的表达式,你需要分组,你可以使它不像这样捕获:

var answers = s.split(/(?:\s*,\s*)|\s+/);

答案 1 :(得分:4)

捕获组的内容将添加到结果数组中。来自MDN documentation

  

如果separator是包含捕获括号的正则表达式,则每次分隔符匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。但是,并非所有浏览器都支持此功能。

使用非捕获组:

/(?:\s*,\s*)|\s+/

答案 2 :(得分:2)

如果您只是删除括号,它将起作用:

var s = 'a,b,c'
var answers = s.split(/\s*,\s*|\s+/);
// [ 'a', 'b', 'c' ]

答案 3 :(得分:0)

使用正则表达式,捕获表达式(x)会记住匹配(并可能将其返回到String.split)。您应该使用(非捕获)分组表达式(?:x)。参见例如Mozilla Docs on RegExp更多。