为什么捕获组结果在双匹配正则表达式中?

14 浏览
0 Comments

为什么捕获组结果在双匹配正则表达式中?

考虑以下两个脚本:

1st: " ".match(/(\s)/)

2nd: " ".match(/\s/)

结果

1st: [" "," "]

2nd: [" "]

我不理解这种行为。据我所知,捕获组/括号的目的是在正则表达式中引用匹配的某个部分。但显然不止于此。或者这种行为是否特定于matchsplit方法。

0
0 Comments

为什么捕获组导致正则表达式匹配结果出现双重匹配?

捕获组有两个作用。一方面,它们可以在正则表达式中(或者在使用.replace()时作为替换字符串)后面被引用,另一方面,它们也会被匹配函数返回,以供调用者使用。这就是为什么.match()返回一个数组:result[0]是整个正则表达式的匹配结果,result[n]是第n个捕获组的匹配结果。

string.split将捕获组的匹配结果拼接到最终的数组中。文档中写道:

如果分隔符是一个包含捕获括号的正则表达式,那么每次匹配到分隔符时,捕获括号的结果(包括任何未定义的结果)都会被拼接到输出数组中。然而,并不是所有浏览器都支持这个功能。

还有一个问题,为什么.split()的行为也不一样,它是否只与.match()以及返回的组有关?谢谢。

我刚刚加入了.split()的文档。

非常感谢,我刚才意识到了。我不知道,也许我应该提一个新的问题。在.match()中,如果我在正则表达式后面加上/g,即全局标志,为什么捕获组不会在数组中返回?

参考stackoverflow.com/questions/432493/…

如果正则表达式有全局标志g,那么它会产生一个包含所有匹配结果但不包括捕获组的数组。参考stackoverflow.com/questions/10901334/…

0
0 Comments

为什么捕获组会导致正则表达式匹配结果重复出现?这个问题的原因是,捕获组不仅用于在模式中引用后面的内容,它们还会显示在结果中。

当你在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/…

0