$ 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而非节点。
答案 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)
在正则表达式中()
表示捕获组。要不捕获它,请使用非捕获组(?:)
。