为什么捕获组结果在双匹配正则表达式中?
为什么捕获组导致正则表达式匹配结果出现双重匹配?
捕获组有两个作用。一方面,它们可以在正则表达式中(或者在使用.replace()时作为替换字符串)后面被引用,另一方面,它们也会被匹配函数返回,以供调用者使用。这就是为什么.match()返回一个数组:result[0]是整个正则表达式的匹配结果,result[n]是第n个捕获组的匹配结果。
string.split
将捕获组的匹配结果拼接到最终的数组中。文档中写道:
如果分隔符是一个包含捕获括号的正则表达式,那么每次匹配到分隔符时,捕获括号的结果(包括任何未定义的结果)都会被拼接到输出数组中。然而,并不是所有浏览器都支持这个功能。
还有一个问题,为什么.split()的行为也不一样,它是否只与.match()以及返回的组有关?谢谢。
我刚刚加入了.split()的文档。
非常感谢,我刚才意识到了。我不知道,也许我应该提一个新的问题。在.match()中,如果我在正则表达式后面加上/g
,即全局标志,为什么捕获组不会在数组中返回?
参考stackoverflow.com/questions/432493/…
如果正则表达式有全局标志g
,那么它会产生一个包含所有匹配结果但不包括捕获组的数组。参考stackoverflow.com/questions/10901334/…
为什么捕获组会导致正则表达式匹配结果重复出现?这个问题的原因是,捕获组不仅用于在模式中引用后面的内容,它们还会显示在结果中。
当你在split方法中使用捕获组时,捕获组会随结果一起返回。由于分隔符是用来切割字符串的,所以使用空格作为输入字符串和/(\s)/作为模式时,得到的结果是["", " ", ""]。
更多关于split方法的信息,请参考这里。
当你使用match方法时,如果没有使用/g修饰符,返回的结果是第一个匹配项。这个结果是唯一的,包含以下内容:
- 整个匹配项
- 捕获组
- 匹配项的索引
- 输入字符串
当你使用match方法时,如果使用了/g修饰符,返回的结果是所有匹配项:
- 第一个完整匹配项
- 第二个完整匹配项
- 等等(在这个例子中只有一个匹配项)
这种行为是正常的。match方法有两种不同的行为(带有/g修饰符和不带有/g修饰符),可以看作是两个功能合一。相比之下,PHP(或其他语言)没有/g修饰符,它有两个不同的函数:preg_match和preg_match_all。
关于split方法的文档中是否有说明它对捕获组的处理方式?你试过去阅读一下吗?
为什么添加/g修饰符(如" ".match(/(\s)/g))会从结果中移除捕获组?为什么捕获组不再显示在结果中?这个问题可以在这里找到答案:stackoverflow.com/questions/10901334/…