javascript regex split 产生太多项目

IT技术 javascript regex split
2021-02-10 03:56:43

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

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

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

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

任何关于我做错了什么的建议将不胜感激。

菲利普

4个回答

那是因为split它也会将捕获组送到结果数组:

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

a之间b的空格由空格匹配,因此捕获组未定义。b之间的逗号c组匹配,因此它成为数组的第四项。

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

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

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

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

捕获组的内容被添加到结果数组中。来自MDN 文档

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

使用非捕获组:

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

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

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

使用正则表达式,捕获表达式会(x)记住匹配项(并可能将其返回给String.split)。您应该使用(非捕获)分组表达式(?:x)有关更多信息,请参见例如关于 RegExpMozilla Docs

这太厉害了。感谢所有回答的人!我仍然有一个残留的问题。如果输入字符串为空,我会得到一个长度为一的列表,其中第一项是一个空字符串,而不是我所期望的长度为零的列表。
2021-04-01 03:56:43
我可以使用以下方法解决此问题,尽管这似乎不是必需的:` if (answers.length == 1 && answers[0] == '') { answers= []; }`
2021-04-08 03:56:43