考虑这两个脚本:
第一个:" ".match(/(\s)/)
和
第二:" ".match(/\s/)
结果
第一个:[" "," "]
第二:[" "]
我不明白这种行为。据我所知,捕获组/括号的目的是让一段匹配项稍后在正则表达式中再次引用。但显然这还不是全部。还是这种行为特定于匹配和拆分方法。
考虑这两个脚本:
第一个:" ".match(/(\s)/)
和
第二:" ".match(/\s/)
结果
第一个:[" "," "]
第二:[" "]
我不明白这种行为。据我所知,捕获组/括号的目的是让一段匹配项稍后在正则表达式中再次引用。但显然这还不是全部。还是这种行为特定于匹配和拆分方法。
第一个脚本:第一个结果是整个模式,第二个是捕获组
第二个脚本:唯一的结果是整个模式。
捕获组不仅要在模式中稍后引用,它们也会显示在结果中。
当您将捕获组与拆分一起使用时,捕获组会与结果一起返回,并且由于分隔符应该对字符串进行切片,因此您通常会以输入字符串和模式的形式获得["", " ", ""]
结果。" "
/(\s)/
当您编写" ".match(/(\s)/)
返回的结果是第一个匹配项。这个结果是独一无二的,包含:
当您编写" ".match(/(\s)/g)
返回的结果是所有匹配项:
(在目前的情况下,你只有一场比赛)
这种行为是正常的。match 方法作为两种不同的行为(有或没有/g
)。它是一种二合一功能。为了比较没有g
修饰符的 PHP(或其他语言),您有两个不同的功能:preg_match
和preg_match_all
捕获组有两个目的。它们可以稍后在正则表达式中引用(或在使用时在替换字符串中.replace()
),但它们也由匹配函数返回,因此调用者可以使用它们。这就是.match()
返回数组的原因:result[0]
是整个正则表达式result[n]
的匹配项,是第一个n
捕获组的匹配项。
string.split
将捕获组的匹配项拼接到结果数组中。文档说:
如果 separator 是一个包含捕获括号的正则表达式,那么每次 separator 匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。但是,并非所有浏览器都支持此功能。