2012-12-24 16 views
1

爲什麼這個代碼(here's the JSBin):不能使之路感JavaScript的正則表達式的作品

var text = "T: 01202 870738"; 

var regex1 = /T: (.*)/; 
var matches1 = text.match(regex1); 

for(var i = 0; i < matches1.length; i++) { 
    log("[" + i + "]: " + matches1[i]); 
} 

將這一情況記錄:

[0]: T: 01202 870738 
[1]: 01202 870738 

和驗證碼(注意:我已經添加了g選項):

var regex2 = /T: (.*)/g; 
var matches2 = text.match(regex2); 

for(var i = 0; i < matches2.length; i++) { 
    log("[" + i + "]: " + matches2[i]); 
} 

將這一情況記錄:

[0]: T: 01202 870738 

我其實不明白爲什麼第一個代碼是01202 870738作爲第二個匹配。如果/T: (.*)/不包含T:,那麼它是如何匹配的?

回答

3

第二個是全局正則表達式,所以返回的數組是表達式在字符串中的所有匹配的列表。第一個不是,所以它是一個組列表,就像你從exec得到的一樣。 (組0是整個比賽,組1是唯一的括號內的組)。

+0

獎金的問題:你怎麼組列表清單,如OP是半顯然期待? – cHao

+0

@cHao:'exec'在循環或'替換',我想? 'replace'很有趣:'var result = []; text.replace(regex2,function(){result.push.apply(result,arguments);});' – Ryan

+0

@cHao:的確如此。 – Juan

1

什麼引發你是從不同的行爲,你從一個正則表達式得到的,並且沒有g標誌。使用g標記的正則表達式調用String.match將返回String對象內該模式的所有實例的數組。例如,表達式:

"Hello World!".match(/l/g);

將返回此數組:

["l", "l", "l"]

但是,調用相同的功能,而不g標誌將返回一個數組,其第一個元素是匹配的模式。之後的任何元素都將與括號內的每個表達式匹配。例如,表達式:

"Hello World!".match(/(Hell)o World(!)/);

將可以方便地返回這個數組:

["Hello World!", "Hell", "!"]

相關問題