javascript正则表达式多个查询

时间:2010-02-13 09:10:34

标签: javascript regex

我有一整套正则表达式查询,可以按顺序递归遍历字符串。

有没有办法可以通过1次调用完成所有操作,例如(不起作用)?

str.replace(/query1|query2|query3|query4|...|[0-9]+|[^]/,
             "reslt1|reslt2|reslt3|reslt4|...|procNumb|procChar");

它只需要在Firefox中工作。现在我坚持:

str.replace(... ,function(a,b,c){if (a=="query1") return "reslt1"; ..............});

谢谢!

编辑:抱歉,如果令人困惑。目标:

之前:“query1query3x123query2” 之后:“reslt1reslt3procChar(x)procNumb(123)reslt2”

最重要的是我需要一次递归处理字符串1片段,所以我想我必须使用这样的超级查询来匹配任何,或者根本不使用正则表达式。我只是想知道是否有一种方法可以在使用大量管道时自动将结果与查询配对。我对javascript正则表达式并不熟悉,但遗憾的是我在mdc上找不到任何东西。

3 个答案:

答案 0 :(得分:1)

如果你试图匹配几个替代子串中的任何一个,并为每个匹配提供不同的结果,那么你将不得不使用一个函数(就像你正在做的那样)。例如:

var str = "ABCDE";

str = str.replace(/A|B|C|D/g, function(match) {
    var rv;
    switch (match)
    {
        case 'A':
            rv = '1';
            break;
        case 'B':
            rv = '2';
            break;
        case 'C':
            rv = '3';
            break;
        case 'D':
            rv = '4';
            break;
    }
    return rv;
});
alert(str); // Alerts 1234E

(当然,作为数组查找,这个特定的例子会更好。)

如果你是一个垂直的简洁恶魔(我不是,但有些人),你可以使用早期回报:

str = str.replace(/A|B|C|D/g, function(match) {
    switch (match)
    {
        case 'A': return '1';
        case 'B': return '2';
        case 'C': return '3';
        case 'D': return '4';
    }
});
alert(str); // Alerts 1234E

编辑为了清楚起见,关于我上面的“数组查找”评论:如果替换实际上只是一个静态查找,你可以这样做:

var str, replacements, key, rex;

// Potentially one-time prep, if you're re-using this lookup
replacements = {
    "A": "1",
    "B": "2",
    "C": "3",
    "D": "4"
};
rex = [];
for (key in replacements)
{
    rex.push(key);
}
rex = new RegExp(rex.join('|'), "g");

// The bit you reuse
str = "ABCDE";
str = str.replace(rex, function(match) {
    return replacements[match];
});
alert(str); // Alerts 1234E

...因为JavaScript对象是关联数组。

答案 1 :(得分:0)

为什么不直接在循环中逐个运行它们:

for (var i = 0; i < regexes.length; i++) {
    str = str.replace(regexes.regex, regexes.result);
}

它易于理解,或多或少易于维护,并且可能比一个巨大的查询更快。正则表达式中的那些替代品价格很高。

答案 2 :(得分:0)

假设您要将query1替换为reslt1,将query2替换为reslt2,依此类推,我认为不能使用单个正则表达式来完成。但是,它相当简单地使用Nx2数组(或一个对象,但这样的定义会更加冗长):

var repl_table = [[/query1/g, 'reslt1'],
                  [/query2/g, 'reslt2'],
                  [/query3/g, 'reslt3'],
                  [/query4/g, 'reslt4'],
                  [/([0-9]+)/g, 'procNumb($1)'],
                  [/([^])/g, 'procChar($1)']]

function repl(s, table) {
  for (var i=0; i<table.length; i++) {
    s = s.replace(table[i][0], table[i][1]);
  }
  return s;
}

// Then call:
result = repl(source, repl_table);