Javascript正则表达式匹配并替换百分比符号

时间:2012-01-09 18:01:15

标签: javascript regex

抱歉我的英文

我正在尝试从字符串中替换不是%d,%m或%Y的所有内容,我一直在尝试,但我没有得到它,这是我最好的尝试代码:

var old_string = "%l %d de %M de %Y (Semana %W)";               
string = old_string.replace(/[^(%d|%m|%Y)]/g, " ");             
alert(old_string + " <----> " + string);

有些帮助吗? 我做错了什么?

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望来自字符串的子字符串%d%m%Y。我假设你想在每场比赛之间留一个空格,并希望保留原始的出现顺序。

您可以使用String.match()Array.join()执行此操作,如下所示:

var old_string = "%l %d de %m de %Y (Semana %W)";
var matches = old_string.match(/%[dmY]/g);
var new_string = matches.join(" ");

alert(new_string); // "%d %m %Y"

修改:这是一个有效的演示:http://jsfiddle.net/PPvG/Gv3rX/1/

编辑(2):我意识到正则表达式可以进一步简化。

答案 1 :(得分:0)

在您的代码中,您错误地使用了字符类。您的正则表达式将匹配任何不是(%d|mY)之一的单个字符。相反,您可能希望使用否定前瞻来检查您匹配的字符串是否不是指定的字符串之一。以下正则表达式应该这样做:

/(?!(.*?)%(d|m|Y).*).*/

这将使用单个空格替换任何不包含指定字符串的长度的字符串。

答案 2 :(得分:0)

如果我理解正确,结果字符串将是%d de de %Y (Semana),这对我来说没有意义,因为我是西班牙语用户。但是这里有你的正则表达式的替代品。

var old_string = "%l %d de %M de %Y (Semana %W)";
var new_string = "";

var i = 0;
while (i < old_string.length) {
    var char = old_string[i];

    new_string += char; 
    if (char == "%") {
        ++i;

        var next_char = old_string[i];

        switch (next_char) {
            case "d":
            case "m":
            case "Y":
                new_string += next_char;
                break;
            default:
                new_string = new_string.substring(0, new_string.length - 2);
        }
    }

    ++i;
}


alert(new_string);