2013-02-23 73 views
3

我是JavaScript新手,對正則表達式有疑問。我有以下代碼:需要全局匹配幫助的JavaScript正則表達式

var patt3=new RegExp(/(July|August)\s+\d{1,2}(\s|,)\d{4}/g); 
var str3 = "August        12,1988"; 
var match3 = str3.match(patt3); 
document.write(match3.toString() + "<br/>"); 

的輸出是:八月12,1988

這裏是相同的代碼,但與來自正則表達式的結尾去除的「G」:

var patt3=new RegExp(/(July|August)\s+\d{1,2}(\s|,)\d{4}/); 
var str3 = "August        12,1988"; 
var match3 = str3.match(patt3); 
document.write(match3.toString() + "<br/>"); 

輸出成爲:8月12日,1988年8月,,

從我在網上找到的定義中,'g'應該匹配所有出現的模式。但我仍然對代碼上的'g'有什麼影響感到困惑。

我非常感謝任何澄清。

在此先感謝。

回答

1

g只匹配所有出現的整個模式。這與匹配PHP的preg_match_all等羣體並不相似。如果沒有g,它只匹配模式的第一次出現(matches[0]),並且所有匹配的組都是其他數組元素。

如果你想獲得嵌套的比賽,以及,你可以用描述的概念通過John Resig這樣做:

str3.replace(patt3, function() { 
    //This is the first captured group in all matches iterated over 
    console.log(arguments[1]); 
}); 
4

關鍵的區別是,string.match方法是defined有不同的行爲如果正則表達式模式是全局性的。

如果模式是全局的,則爲包含所有匹配項的數組。你的情況,你只有一個匹配,但你可以看到像

「AAAA」 .match一個例子(/ A(A)/ G)的區別; //返回[「AA」,「AA」]

如果模式不是全局的,然而,該方法返回對應於找到的第一個匹配的陣列。該數組在第一個位置包含完整匹配的字符串,在其他位置包含捕獲。捕獲是由括號分隔的正則表達式的位。再次,可以看到與實施例的區別是:

「AAAA」 .match(/ A(A)/克); //返回[「aa」,「a」]


最後,我只想指出你的代碼中的一些小問題。

首先,你並不需要在這裏使用new Regexp構造。只需使用正則表達式字面直接

var patt3 = /(July|August)\s+\d{1,2}(\s|,)\d{4}/g 

其次,不要盲目「的toString」的事情。在你的情況下,你正在將這種方法應用於數組,這就是爲什麼你會得到你奇怪的結果。

最後,學會使用開發工具,包括調試和執行console.log。它比濫用document.write更好,並且在表現力和生產力方面提高警覺。

console.write(match3) 
0

String.match上引用the docs

如果正則表達式不包括g標誌,返回相同的結果爲regexp.exec(string)

如果正則表達式包括g標誌,則該方法返回含有所有比賽的Array。如果沒有匹配,則該方法返回null。

在第二個示例中,數組的第一個元素是匹配項,而其他元素是捕獲組。使用g,每個元素將是不同的匹配。