在正则表达式拆分期间发生javascript未定义元素

时间:2015-12-15 15:01:15

标签: javascript regex

以下代码导致中间的未定义元素

"Hello World\n\nhello world".split(/\n(\n|\t|\s)*?\n/)
"Hello World\n\nhello world".split(/\n(\n|\t|\s)*\n/)

输出

["Hello World", undefined, "hello world"]

如果有两个新的行字符,并且它们之间没有任何数量的新行,空格或制表符,只要它们不是字母或符号或数字,我想拆分。

2 个答案:

答案 0 :(得分:7)

这是因为当您在拆分模式中使用捕获组时,javascript会在结果中包含捕获组的内容。由于捕获组不能为空,因此永远不会重复,这就是为什么你得到“未定义”而不是空字符串的原因。

要防止这种情况,请使用非捕获组或字符类:

"Hello World\n\nhello world".split(/\n(?:\n|\t|\s)*\n/)
"Hello World\n\nhello world".split(/\n\s*\n/) # (\t and \n are already included in \s)

注意:如果您也想删除前导和尾随空格,可以使用:

/(?:[^\S\n]*\n){2}\s*/

答案 1 :(得分:4)

使用non-capturing group来防止包含捕获组的内容。

/\n(?:\n|\t|\s)*?\n/

它将返回:

"Hello World\n\nhello world".split(/\n(?:\n|\t|\s)*?\n/);
// ["Hello World", "hello world"]