2014-02-19 30 views
1

爲什麼ghi的結果與abc或def不同?請告訴我差異正則表達式結果

ABC的結果爲abc:ABCDEF

DEF的結果是DEF:ABCDEF

GHI的結果爲GHI:A- {1} -C- {3} -E- {5}

請讓我知道原因!

function abc(){ 
    var lang = "{0}-{1}-{2}-{3}-{4}-{5}"; 
    var args = ["a","b","c","d","e","f"]; 
    var exp = /\{(\d+)\}/; 
    var matches = exp.exec(lang); 
    while (matches) { 
     var index = parseInt(matches[1], 10); 
     lang  = lang.replace(matches[0], args[index]); 
     matches = exp.exec(lang); 
    } 
    console.log('abc: ' + lang); 
} 
abc(); 
function def(){ 
    var lang = "{0}-{1}-{2}-{3}-{4}-{5}"; 
    var args = ["a","b","c","d","e","f"]; 
    var exp = /\{(\d+)\}/g; 
    var matches = exp.exec(lang); 
    while (matches) { 
     var exp = /\{(\d+)\}/g; 
     var index = parseInt(matches[1], 10); 
     lang  = lang.replace(matches[0], args[index]); 
     matches = exp.exec(lang); 
    } 
    console.log('def: ' + lang); 
} 
def(); 
function ghi(){ 
    var lang = "{0}-{1}-{2}-{3}-{4}-{5}"; 
    var args = ["a","b","c","d","e","f"]; 
    var exp = /\{(\d+)\}/g; 
    var matches = exp.exec(lang); 
    while (matches) { 
     var index = parseInt(matches[1], 10); 
     lang  = lang.replace(matches[0], args[index]); 
     matches = exp.exec(lang); 
    } 
    console.log('ghi: ' + lang); 
} 
ghi(); 

回答

0

功能ghi()需要重置RegExp對象的lastIndex內循環:

function ghi(){ 
    var lang = "{0}-{1}-{2}-{3}-{4}-{5}"; 
    var args = ["a","b","c","d","e","f"]; 
    var exp = /\{(\d+)\}/g; 
    while (matches = exp.exec(lang)) { 
     var index = parseInt(matches[1], 10); 
     lang  = lang.replace(matches[0], args[index]); 
     exp.lastIndex = 0; 
    } 
    console.log('ghi: ' + lang); 
} 

由於exp.lastIndex = 0;呼叫現在輸出將是相同的。

JavaScript的RegExp對象是有狀態的。使用全局標誌時,如果您調用的方法與對象相同,它將從上次匹配結束時的下一個索引處開始。

+1

你的回答對我來說非常有用。謝謝! – user3326728

+0

不客氣,很高興幫助。 – anubhava