JavaScript - 在RegExp中用“/”替换“\”字符的正确方法是什么

时间:2015-10-31 16:05:08

标签: javascript jquery regex

我在JavaScript中定义了一个替换所有-_@#$\的函数(它们是可能的分隔符)/(有效分隔符)。

我的目标是将任何字符串"1394_ib_01#13568"转换为"1394/ib/01/13568"

function replaceCharacters(input) {

    pattern_string = "-|_|@|#|$|\u005C";      // using character Unicode
    //pattern_string = "-|_|@|#|$|\";         // using original character
    //pattern_string = "-|_|@|#|$|\\";        // using "\\"
    //pattern_string = "\|-|_|@|#|$";         // reposition in middle or start of string
    pattern = new RegExp(pattern_string, "gi");

    input = input.replace(pattern, "/");
    return input;
}

我的问题是当发送到函数结果的\字符的字符串无效时。

我尝试在定义模式中使用\的Unicode,或者使用\\\代替它。我也用模式字符串替换了它的位置。但在任何这种情况下,问题都没有解决,浏览器返回无效结果或不同的错误,如:

SyntaxError: unterminated parenthetical    ---> in using "\u005C"
SyntaxError: \ at end of pattern           ---> in using "\\"
Invalid Result: broken result in 2 Line or replace with undefined character based on input string (the character after "\" determine result)
                        ---> in reposition it in middle or start of pattern string

1 个答案:

答案 0 :(得分:8)

var pattern_string = "-|_|@|#|\\$|\\\\";

你必须为模式转义一次斜杠,所以它会尝试匹配文字字符:

\\

然后,再次为字符串文字转义每个斜杠:

"\\\\"

另请注意,我为$添加了转义符。要从字面上匹配一个美元符号,它也需要进行转义,因为它通常代表“{3}}为”行/字符串的结尾。“

你也可以使用anchor来避免字符串,只使用模式所需的转义序列:

var pattern = /-|_|@|#|\$|\\/gi;

而且,由于您只匹配单个字符,因此您可以使用Regex literal代替character class

var pattern = /[-_@#\$\\]/gi;

(请注意-在这里的位置。它可以作为班级中的第一个字符,但是当放在中间时可以代表一系列字符。你也可以逃避它以确保它不代表范围。)