通常當你這樣做'test'.match(/(e)/)
你會得到一個數組['e', 'e']
,其中第一個元素是比賽本身和選擇(括號)第二,但採用全球改性劑在'test'.match(/(e)/g)
時它會省略匹配,但它不會防止我根本不使用選擇器。全球匹配使用JavaScript正則表達式
我想知道是否以及在哪裏指定了以下行爲(使用Chromium進行此測試)。
通常當你這樣做'test'.match(/(e)/)
你會得到一個數組['e', 'e']
,其中第一個元素是比賽本身和選擇(括號)第二,但採用全球改性劑在'test'.match(/(e)/g)
時它會省略匹配,但它不會防止我根本不使用選擇器。全球匹配使用JavaScript正則表達式
我想知道是否以及在哪裏指定了以下行爲(使用Chromium進行此測試)。
如果未設置全局標誌(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"]
有沒有內置,將收集所有比賽所有羣體,像蟒蛇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]
]
該行爲指定在ECMA script language spec。本節詳細描述了使用和不使用全局修飾符的正則表達式引擎的過程。
在點11具體:If global is true, Call the [[Put]] internal method of R with arguments "lastIndex", e, and true.
謝謝!這是我所尋找的重要組成部分。我監督了這一點。 – user1680104
的['.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