2013-01-22 26 views
0

通常當你這樣做'test'.match(/(e)/)你會得到一個數組['e', 'e'],其中第一個元素是比賽本身和選擇(括號)第二,但採用全球改性劑在'test'.match(/(e)/g)時它會省略匹配,但它不會防止我根本不使用選擇器。全球匹配使用JavaScript正則表達式

我想知道是否以及在哪裏指定了以下行爲(使用Chromium進行此測試)。

+0

的['.match()'方法](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/match)根據全局標誌的存在應該有不同的表現。可能對於您的要求,您應該在循環中調用['.exec()'方法](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec)? – nnnnnn

回答

2

如果未設置全局標誌(g),則數組的元素零包含整個匹配,而元素1到n包含任何子匹配。此行爲與全局標誌未設置時的exec方法(正則表達式)(JavaScript)的行爲相同。如果設置了全局標誌,則元素0到n包含發生的所有匹配。

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

換言之,當提供gmatch僅收集最上面的匹配,忽略任何捕獲組。

例子:

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

有沒有內置,將收集所有比賽所有羣體,像蟒蛇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

該行爲指定在ECMA script language spec。本節詳細描述了使用和不使用全局修飾符的正則表達式引擎的過程。

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

+0

謝謝!這是我所尋找的重要組成部分。我監督了這一點。 – user1680104