JavaScript - 在正则表达式中,用什么方法正确地将 "\" 字符替换为 "/"?

7

我在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

你能提供一个输入的例子和期望的结果吗?不清楚你传递给 replaceCharacters 函数的内容...例如: 输入:'hello world'; 输出:'goodbye world' - Hitmands
尊敬的Hitmands先生/女士,我将“categoryname#objectname@1394\02\01-codeID”发送到函数中。我期望函数返回“categoryname/objectname/1394/02/01/codeID”。 - M.i.T
1个回答

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

您需要对斜杠进行转义,这样它才能匹配字面上的字符:

\\

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

"\\\\"
还要注意我添加了对$的转义。为了字面匹配美元符号,它也需要被转义,因为它通常代表行/字符串结束的锚点
你也可以使用正则表达式字面量来避免字符串,只使用必要的转义序列来匹配模式:
var pattern = /-|_|@|#|\$|\\/gi;

而且,由于您只匹配单个字符,因此可以使用字符类而不是交替

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

在这里要小心-的位置。如果它是类的第一个字符,那么没问题,但如果放在中间,它就可能代表一系列字符。你也可以使用转义字符来确保它不代表一系列字符。


@Jonathan Lonowski 先生,感谢您的关注。我用我的代码替换了您的解决方案,并再次调用函数使用 "categoryname#objectname@1394\02\01-codeID"。我期望函数返回 "categoryname/objectname/1394/02/01/codeID"。但结果是 "categoryname/objectname/1394/codeID" - M.i.T
我的错误在于我发送了字符串categoryname#objectname@1394\02\01-codeID,这是错误的输入。 在JavaScript中,当我想要调用带有直接参数字符串的函数时,我必须发送 categoryname#objectname@1394\\02\\01-codeID 到函数。因为第一个 '' 意味着下一个字符是特殊字符,所以我的输入字符串中的'\'序列仅表示一个''。 - M.i.T

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