JavaScript正则表达式匹配和替换百分号符号

3

对不起我的英语

我正在尝试从字符串中替换除了%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);

需要帮忙吗? 我做错了什么?


1
首先,不要将一个字符串变量命名为 string,因为它是JavaScript的关键字... - Naftali
1
替换完成后,示例字符串应该是什么样的?每个单词后面是否需要额外的空格?括号是否要保留? - murgatroid99
2
string在JavaScript中绝对不是一个关键字。虽然用它作为变量名可能不是一个很好的选择,但对于这个例子来说并没有什么问题。 - pimvdb
3个回答

3
如果我理解正确,您想从字符串中提取子串%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):我意识到正则表达式可以进一步简化。


var old_string = "%l %d de %m de %Y (Semana %W)"; %m is downcase. 谢谢和问候。 - el_quick

0
在你的代码中,你错误地使用了字符类。你的正则表达式将匹配任何不是(%d|mY)之一的单个字符。相反,你可能想要使用负向先行断言来检查你正在匹配的字符串是否不是指定的字符串之一。以下正则表达式应该可以解决这个问题:
/(?!(.*?)%(d|m|Y).*).*/

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

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

1
这样做old_string.match(/%[dmY]/g).join('')是不是有点绕弯子?我同意,如果可能的话,应该避免使用正则表达式,以免解决方案变得不清晰。但在这种情况下,我认为并非如此。 - Peter-Paul van Gemerden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接