为什么捕获组导致双匹配正则表达式

时间:2013-09-02 16:47:58

标签: javascript regex

考虑这两个脚本:

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

第二名:" ".match(/\s/)

结果

1st:[" "," "]

第二名:[" "]

我不明白这种行为。据我所知,捕获组/ paranthesis的目的是要在后面的regex中再次引用一段匹配。但显然并非全部。或者此行为是否特定于匹配拆分方法。

2 个答案:

答案 0 :(得分:6)

第一个脚本:第一个结果是整个模式,第二个是捕获组

第二个脚本:唯一的结果是整个模式。

捕获组不仅要在模式中稍后引用,它们也会显示在结果中。

当您使用具有拆分的捕获组时,捕获组将返回结果,并且由于分隔符应该对字符串进行切片,因此您通过
{{["", " ", ""]得到" "是正常的。 1}}作为输入字符串,/(\s)/作为模式。

More informations about split.

当你写" ".match(/(\s)/)时,返回的结果是第一个匹配。此结果是唯一的,包含:

  • 整场比赛
  • 捕获小组
  • 比赛指数
  • 输入字符串

当您写" ".match(/(\s)/g)时,返回的结果是所有匹配项:

  • 整场比赛1
  • 整场比赛2

(在目前的情况下,你只有一场比赛)

这种行为很正常。匹配方法为两种不同的行为(有或没有/g)。它是一种两种功能于一体。为了在没有g修饰符的PHP(或其他语言)中进行比较,您有两个不同的函数:preg_matchpreg_match_all

答案 1 :(得分:4)

捕获组有两个目的。它们可以在后面的regexp中引用(或在使用.replace()时在替换字符串中),但它们也由匹配函数返回,以便调用者可以使用它们。这就是.match()返回数组的原因:result[0]是整个正则表达式的匹配,result[n]n捕获组的匹配。

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

  

如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。但是,并非所有浏览器都支持此功能。