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