通常当你做类似的事情时'test'.match(/(e)/)
你会收到一个数组['e', 'e']
,其中第一个元素是匹配本身,第二个元素是选择器(大括号),但是当使用全局修饰符时,如'test'.match(/(e)/g)
它会忽略匹配,但如果我根本不使用选择器则不会。
我想知道是否以及在何处指定了以下行为(使用 Chromium 进行此测试)。
如果未设置全局标志 (g),则数组的元素 0 包含整个匹配项,而元素 1 到 n 包含任何子匹配项。此行为与未设置全局标志时 exec 方法(正则表达式)(JavaScript) 的行为相同。如果设置了全局标志,则元素 0 到 n 包含发生的所有匹配项。
http://msdn.microsoft.com/en-us/library/ie/7df7sf4x(v=vs.94).aspx http://msdn.microsoft.com/en-us/library/ie/7df7sf4x(v=vs.94).aspx
换句话说,当g
提供,match
仅收集最上面的匹配项,忽略任何捕获组。
Example:
> s = "Foo Bar"
"Foo Bar"
> s.match(/([A-Z])([a-z]+)/)
["Foo", "F", "oo"]
> s.match(/([A-Z])([a-z]+)/g)
["Foo", "Bar"]
没有内置程序可以收集所有比赛中的所有组,例如 pythonfindall
确实如此,但是使用它很容易编写exec
:
function matchAll(re, str) {
var p, r = [];
while(p = re.exec(str))
r.push(p);
return r;
}
matchAll(/([A-Z])([a-z]+)/g, "Foo Bar")
Result:
[
Array[3]
0: "Foo"
1: "F"
2: "oo"
index: 0
input: "Foo Bar"
length: 3
__proto__: Array[0]
,
Array[3]
0: "Bar"
1: "B"
2: "ar"
index: 4
input: "Foo Bar"
length: 3
__proto__: Array[0]
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)