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

IT技术 javascript regex
2021-02-20 12:39:15
$ 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 而不是 node.js 的。

5个回答

在您的第二个结果中,a出现是因为您将它包装在一个捕获组()(括号)中。

如果你想包括,但你还是需要一个条件组,使用非捕获组:(?:a)问号-冒号可以在任何捕获组中使用,并且将从捕获的结果列表中省略。

这是一个简单的例子:http : //regex101.com/r/yM1vM4

不,那是我尽力而为的锤子 ;) 右边是钉子。
2021-05-07 12:39:15
====[] |-- 我这样做:)
2021-05-13 12:39:15
左边那个是钉子吗?我从未见过方钉
2021-05-14 12:39:15
钉子被@remus 打在了头上,谢谢
2021-05-16 12:39:15
啊这更有意义
2021-05-19 12:39:15

根据ECMA

String.prototype.split(分隔符,限制)

如果separator是一个包含捕获括号的正则表达式,那么每次separator匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。

给出的例子是:

"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"]

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

如果将 {2} 移到括号内:

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

然后你会得到

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

如果您不想要“aa”,请不要将其分组在括号中。IE

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

["abab", "bab"]
()正在捕获最后一场比赛,而不是第一场比赛......如"ababazbab".split(/(a|z){2}/)=>[..., "z", ...]
2021-05-05 12:39:15

split 不断捕获组。这就是为什么你会在结果中看到它。

查看描述和捕获括号:

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

使用非捕获组? (?:)
2021-05-05 12:39:15
是的,那是d'oh片刻。
2021-05-12 12:39:15

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

当我分裂时,我想保留这个小组仍然没有意义。不过没关系。(?:)它是。
2021-04-26 12:39:15