使用JavaScript正则表达式的全局匹配

时间:2013-01-22 11:20:31

标签: javascript regex

通常当你执行'test'.match(/(e)/)之类的操作时,你会收到一个数组['e', 'e'],其中第一个元素是匹配本身,第二个元素是选择器(大括号),但是当使用全局修饰符时在'test'.match(/(e)/g)中它将省略匹配,而在我不使用选择器的情况下则不会。

我想知道是否以及指定了以下行为(使用Chromium进行此测试)。

2 个答案:

答案 0 :(得分:2)

  

如果未设置全局标志(g),则数组的元素零包含整个匹配,而元素1到n包含任何子匹配。当未设置全局标志时,此行为与exec方法(正则表达式)(JavaScript)的行为相同。如果设置了全局标志,则元素0到n包含发生的所有匹配。

http://msdn.microsoft.com/en-us/library/ie/7df7sf4x(v=vs.94).aspx

换句话说,当提供g时,match仅收集最高匹配,忽略任何捕获组。

示例:

> s = "Foo Bar"
"Foo Bar"
> s.match(/([A-Z])([a-z]+)/)
["Foo", "F", "oo"]
> s.match(/([A-Z])([a-z]+)/g)
["Foo", "Bar"]

没有内置会收集所有匹配的所有组,例如python findall,但使用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")

结果:

[
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]
]

答案 1 :(得分:1)

行为在ECMA script language spec指定。本节详细描述了使用和不使用全局修饰符的正则表达式引擎所遵循的过程。

第11点具体:If global is true, Call the [[Put]] internal method of R with arguments "lastIndex", e, and true.