正则表达式结果的差异

时间:2014-02-19 07:08:16

标签: regex

为什么ghi的结果与abc或def不同?

abc的结果是abc:a-b-c-d-e-f

def的结果是def:a-b-c-d-e-f

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();

1 个答案:

答案 0 :(得分: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对象时,它将从最后一个匹配结束时的下一个索引开始。