2012-06-05 23 views
8

在這本書中‘的JavaScript:好的部分’,它解釋瞭如下方法string.match(regexp)我不能準確地理解如何做JavaScript的方法string.match(正則表達式)「SG標誌工作

匹配方法匹配一個字符串和一個正則表達式。它如何 這取決於g標誌。如果沒有g標誌,則調用字符串.match(regexp)的結果與調用 regexp .exec(string)的結果相同。然而,如果正則表達式具有g標誌,那麼它 產生所有匹配的數組,但不包括捕獲 組:

然後書中提供的代碼示例:

var text = '<html><body bgcolor=linen><p>This is <b>bold<\/b>!<\/p><\/body><\/html>'; 
var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g; 
var a, i; 
a = text.match(tags); 
for (i = 0; i < a.length; i += 1) { 
    document.writeln(('// [' + i + '] ' + a[i]).entityify()); 
} 
// The result is 
// [0] <html> 
// [1] <body bgcolor=linen> 
// [2] <p> 
// [3] This is 
// [4] <b> 
// [5] bold 
// [6] </b> 
// [7] ! 
// [8] </p> 
// [9] </body> 
// [10] </html> 

我的問題是我無法理解「但排除捕獲組」。

在上面的代碼示例中,</html>中的html位於捕獲組中。爲什麼它仍然包含在結果數組中?

而且/</html>中也在捕獲組中。爲什麼它包含在結果數組中?

你能解釋一下「但不包括捕獲組」嗎?

非常感謝!

回答

10

在上面的代碼示例中,html位於捕獲組中。爲什麼它仍然包含在結果數組中?

因爲這是完全匹配。當他說「但不包括捕獲組」時,他並不意味着完全匹配的結果,只是捕獲組的內容不是在數組中重複了。如果捕獲組都包括在內,你會看到

// The result is 
// [0] <html> 
// [1]   // From the capture group; nothing here 
// [2] html  // From the capture group 
// [3]   // From the capture group; nothing here 
// ... 

而且/在也是一個捕獲組。爲什麼它包含在結果數組中?

出於與上述相同的原因:它是總體比賽的一部分,這就是結果;單個捕獲組的內容不是。

這更容易理解一個更簡單的例子。考慮以下代碼:

var s = "test1 test2"; 
var re = /(test)(.)/g; 
var r = s.match(re); 
var i; 
for (i = 0; i < r.length; ++i) { 
    console.log("[" + i + "]: '" + r[i] + "'"); 
} 

因爲正則表達式有g標誌,只有充分的匹配都包含在陣列中,讓我們看到:

[0]: 'test1' 
[1]: 'test2'

在每種情況下,陣列中的條目是完全匹配,其中包括組成整體表達的捕獲組內匹配的字符。

如果我們去掉了g標誌,但沒有別的改變什麼,我們就得到了第一個完整的比賽,然後在兩個捕獲組的內容:

[0]: 'test1' // The full match, including the stuff from each capture group 
[1]: 'test'  // Capture group 0's contents 
[2]: '1'  // Capture group 1's contents

在那裏,第一項是完全匹配;那麼第二個和第三個是捕獲組的內容。請注意,捕獲問題的內容

+0

非常感謝!你的回答是正確的,詳細和有益的! – weilou

+0

@ WeiLou::-)謝謝!很高興這有幫助。最好, –

0

g修飾符是全局應用正則表達式。沒有它,正則表達式會匹配並返回找到的第一個匹配項。有了它,它會搜索並匹配字符串中的所有匹配項。

相關問題