5

考虑这两个脚本:

第一个:" ".match(/(\s)/)

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

结果

第一个:[" "," "]

第二:[" "]

我不明白这种行为。据我所知,捕获组/括号的目的是让一段匹配项稍后在正则表达式中再次引用。但显然这还不是全部。还是这种行为特定于匹配拆分方法。

4

2 回答 2

6

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

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

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

当您将捕获组与拆分一起使用时,捕获组会与结果一起返回,并且由于分隔符应该对字符串进行切片,因此您通常会以输入字符串和模式的形式获得["", " ", ""]结果。
" "/(\s)/

有关拆分的更多信息。

当您编写" ".match(/(\s)/)返回的结果是第一个匹配项。这个结果是独一无二的,包含:

  • 整场比赛
  • 捕获组
  • 比赛索引
  • 输入字符串

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

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

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

这种行为是正常的。match 方法作为两种不同的行为(有或没有/g)。它是一种二合一功能。为了比较没有g修饰符的 PHP(或其他语言),您有两个不同的功能:preg_matchpreg_match_all

于 2013-09-02T16:48:45.447 回答
4

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

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

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

于 2013-09-02T16:51:20.767 回答