在JavaScript中将双反斜杠替换为单反斜杠

在JavaScript中将双反斜杠替换为单反斜杠,javascript,regex,Javascript,Regex,我正在编写一个函数,该函数将删除\\,并将其替换为\。我注意到,对于不是二次幂的反斜杠(当然不是二次幂),代码也不起作用 函数x(输入){ var-arr=[]; 对于(变量i=0;i

我正在编写一个函数,该函数将删除
\\
,并将其替换为
\
。我注意到,对于不是二次幂的反斜杠(当然不是二次幂),代码也不起作用

函数x(输入){
var-arr=[];
对于(变量i=0;i
代码将返回
['\\a']

编辑:

下面是一个更复杂的例子:

输入:
[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\”]
输出:
['\\''a']
所需输出:
[“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\“
因为输入字符串在传递给函数之前正在转义。replace正则表达式查找双反斜杠,因此给定输入,它将只匹配三个反斜杠中的前两个,将其替换为一个,其余的保持不变。。。这就是为什么它会返回
“[”\\\“\”a\”“]”的原因。

例如,如果调用函数,从输入字段获取输入字符串,则函数可以按需要工作

如果您想使用显式字符串文本实现所需的结果,可以使用
/\\/g
作为replace regex(实际上根本不做replace),但它不会双向工作,除非据我所知,您为函数提供了一种知道字符串来自何处的方法(可能带有可选参数)并手动处理这些可能性

例如:

function x(input, caller) {
  return input.replace(caller === 'console' ? /\\/g : /\\\\/g, "\\");
}

console.log(x('["\\\\\\\"\\"a\\""]', "console"));

$("button").click(function() {
  console.log(x($("input").val()));
});
检查对x函数的调用是否传递了值为“console”的第二个参数,并相应地更改replace函数的正则表达式。

使用正则表达式时

  • 必须用
    \
    转义文字反向索利多金币(又称反斜杠,(又称
    \

  • 因此,当您输入
    \\
    时,实际上就是
    \

  • 如果你想输入2个
    \
    ,每个都必须转义。这意味着
    \\\\
    实际上是一个由2个
    \
    组成的字符串

以下演示使用ES6模板文本:

  • 这是一种新的字符串语法,它使用反勾号`(左上角键)而不是引号“or”

  • 它可以通过前缀
    ${
    和后缀
    }
    插入变量

    var x = 2; `this template literal will display x as ${x}.`
    // this template literal will display x as 2.
    
  • \
    是unicode格式的
    U+5c
    。在模板文本中使用转义unicode,它的前缀为
    \u{
    ,后缀为
    }

    `A template literal with an escaped unicode backslash is \u{5c}`
    // A template literal with an escaped unicode backslash is \.
    
演示
函数XtoY(str,x,y){
var rgx=`/${x}/g`;
var result=str.replace(rgx,`${y}`);
返回结果;
}
常量uni=`\u{5c}`;
常量字符串=`\\a\\a\\b`;
常量from=`${uni}${uni}`
常量to=`${uni}`;
设z=XtoY(字符串,从,到);

控制台日志(z)你是不是因为这是一个你意想不到的结果而指出
x(['\\a'])
?如果是的话,你希望它会返回什么
'\\a'
成为表示
\a
的字符串文字(因为它在字符串中,第一个反斜杠转义第二个,使其成为文字反斜杠)
\a
\\
不匹配(这是您的正则表达式正在搜索的内容),因此没有任何内容被替换,而
\a
被按原样推送到返回的
arr
数组中。我意识到替换使用了字符串文字,这就是此代码无法正常工作的原因,但是我想不出任何方法来实现我想要的-那就是让控制台记录
['\a']
。最终,我正在构建一个JSON解析器,它需要能够支持转义字符。您应该提供更多所需输入和输出的示例。
“\\\\\\\\\\\\\\”“
不是一个有效的字符串……我认为您缺少一些关于js字符串的基本知识。它传递到解析器的方式是[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\“
因此它是一个有效字符串。如果正确解析它,它本身也会成为一个有效的字符串。有趣的是,在es6中有一种方法可以做到这一点,但在早期版本中似乎不可能做到这一点。另外,在我发布的代码中,我使用了
'\\\'
来表示两个反斜杠。
'\\\'
是表示两个反斜杠的正确方法。你已经掌握了逃跑的特殊角色,对不起,我以为这是你的问题。如果您想要一种方法来输入
\\a
并逐字解释每个反斜杠,例如输入:
\\a
解释为:
\\a
,则模板文字是完美的解决方案。可以分解具有数百个反斜杠的字符串。因此,一个简单的替换函数可以提供一个原始字符串和一个普通字符串文本(“熟”)版本。
`A template literal with an escaped unicode backslash is \u{5c}`
// A template literal with an escaped unicode backslash is \.