我想在%\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"]
答案 0 :(得分:7)
引用String.prototype.split
的{{3}}:
如果separator是包含捕获的正则表达式 括号,然后每次分隔符匹配,结果 捕获括号的(包括任何未定义的结果)是 拼接到输出数组中。
关键是任何捕获组都被拼接 - 即使是错过目标的那个。您示例中的第一个undefined
是\n
匹配的“虚无”(%\d
匹配时发生拆分),第二个%\d
(\n
时msg.split(/\n|%\d/); // ["foo ", " bar ", " baz ", ""]
匹配)...你看到了图片。
要解决此问题,您可以摆脱捕获组(因为交替运算符的优先级最低):
msg.split(/(\n|%\d)/);
// ["foo ", "%1", " bar ", "\n", " baz ", "%2", ""]
如果您确实需要分离部分,请仅使用一个捕获组:
{{1}}