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

Tec*_*sin 3 javascript regex

考虑这两个脚本:

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

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

结果

第一名: [" "," "]

第二: [" "]

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

Cas*_*yte 6

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

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

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

当使用捕获组与分裂,捕获组返回带结果并且由于分离器应该切片串,这是正常的你获得["", " ", ""]作为结果与
" "输入的字符串和/(\s)/作为图案.

有关拆分的更多信息.

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

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

当你写" ".match(/(\s)/g)回来的结果是所有的匹配:

  • 全场比赛1
  • 全场比赛2
  • 等等

(在目前的情况下,你只有一个匹配)

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


Bar*_*mar 5

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

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

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