在String.split()中使用捕获组

时间:2014-01-29 00:05:12

标签: javascript regex

$ node
> "ababaabab".split(/a{2}/)
[ 'abab', 'bab' ]
> "ababaabab".split(/(a){2}/)
[ 'abab', 'a', 'bab' ]
>

所以,这对我来说没有意义。有人可以解释一下吗?我不明白'a'出现的原因。

注意:我正在尝试匹配双倍的行结尾(可能在Windows文件中),因此我在/(\r?\n){2}/上分裂。但是我在我的数组中得到了无关的'\015\n'条目(注意\015 == \r)。

为什么会出现这些?

注意:也影响浏览器中的JS引擎,因此这特定于JS而非节点。

5 个答案:

答案 0 :(得分:15)

在第二个结果中,a出现了,因为您已将其包装在捕获组()(括号)中。

如果您希望包含它但仍需要条件组,请使用非捕获组:(?:a)。 questionmark-colon可以在任何捕获组中使用,并且将从结果的捕获列表中省略。

以下是一个简单的示例:http://regex101.com/r/yM1vM4

答案 1 :(得分:3)

因为{2}位于捕获括号之外,我猜它会分裂为2个字符,但只捕获第一个字符。

如果您移动括号内的{2}:

"ababaabab".split(/(a{2})/)

然后你会得到

["abab", "aa", "bab"]

如果您不想要'aa',请不要将其分组到括号中。即。

"ababaabab".split(/a{2}/)

给出

["abab", "bab"]

答案 2 :(得分:3)

根据ECMA

  

String.prototype.split(separator,limit)

     

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

给出的例子是:

"ababaabab".split(/(a){2}/) // [ "abab", "a", "bab" ]

split发生aa,但只有"a"位于捕获组(a)中,因此拼接到输出数组中。

更多例子:

"ababaaxaabab".split(/(a){2}/) // ["abab", "a", "x", "a", "bab"]

"ababaaxaabab".split(/(aa)/) // ["abab", "aa", "x", "aa", "bab"]

答案 3 :(得分:1)

split保持捕获组。这就是你在结果中看到它的原因。

查看描述并捕获括号:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split

答案 4 :(得分:0)

在正则表达式中()表示捕获组。要不捕获它,请使用非捕获组(?:)