为什么string.split()结果包含undefined?

时间:2013-12-19 23:02:36

标签: javascript regex undefined

我想在%\d+\n上拆分字符串。我能够成功地拆分这两个中的任何一个,但两个都没有:

> msg = 'foo %1 bar \n baz %2'

> msg.split(/(%\d+)/)
["foo ", "%1", " bar 
 baz ", "%2", ""]

> msg.split(/(\n)/)
["foo %1 bar ", "
", " baz %2"]

> msg.split(/(\n)|(%\d)/)
["foo ", undefined, "%1", " bar ", "
", undefined, " baz ", undefined, "%2", ""]

在最后一种情况下,为什么结果数组中有undefined,我应该怎么做?

更新:我忽略了说我需要分隔符。我想要的结果是:

["foo ", "%1", " bar ", "\n", " baz ", "%2"]

1 个答案:

答案 0 :(得分:7)

引用String.prototype.split的{​​{3}}:

  

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

关键是任何捕获组都被拼接 - 即使是错过目标的那个。您示例中的第一个undefined\n匹配的“虚无”(%\d匹配时发生拆分),第二个%\d\nmsg.split(/\n|%\d/); // ["foo ", " bar ", " baz ", ""] 匹配)...你看到了图片。

要解决此问题,您可以摆脱捕获组(因为交替运算符的优先级最低):

msg.split(/(\n|%\d)/); 
// ["foo ", "%1", " bar ", "\n", " baz ", "%2", ""]

如果您确实需要分离部分,请仅使用一个捕获组:

{{1}}