2014-02-19 2 views
1

Почему результат ghi отличается от abc или def? Результат, пожалуйста, скажите мне разницу в выражении regexp

ABC является ABC: ABCDEF результат

ДЕФа является Защиту: ABCDEF результат

GHI является GHI: а- {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 объект имеет статус. Когда используется глобальный флаг, и вы вызываете метод тот же объект RegExp, он будет начинаться с следующего индекса с конца последнего совпадения.

+1

Ваши ответы были очень полезны для меня. Спасибо! – user3326728

+0

Добро пожаловать, рад, что это помогло. – anubhava

Смежные вопросы