使用正则表达式替换反斜杠不会替换字母后面的值

时间:2017-06-25 03:19:50

标签: javascript regex

function x(input){
  var arr = [];
  for(var i = 0; i < input.length; i++){
    arr.push(input[i].trim().replace(/\\\\/g, "\\"));
  }

  return arr;
}

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

我希望这会输出['\\ a \'],而是输出['\\ a \\']。即使设置了全局标志,这就像正则表达式未被全局应用一样。

作为反例,如果我写:

var str = "\\\\a\\";

str.replace(/\\\\/g, "\\");

console.log(str);

我得到\\a\,这是正确的。

1 个答案:

答案 0 :(得分:0)

Backslash \是JavaScript String和Regex的特殊字符。因此必须通过反斜杠进行限定。

您的期望不正确,因为\\是单个字符而不是两个字符。同样地,\\\\只有2个字符而不是4个。

> console.log('\\\\'.length + " : " + '\\'.length);
> 2 : 1

假设我们使用其他字符Z来表示\\。然后

\\\\a\\ = ZZaZ
/\\\\/g = /ZZ/g

因此正则表达式将匹配两个匹配前缀部分的Z\\,而不匹配后缀(后缀是单次出现)

更换后会给我们。

> console.log('ZZaZ'.replace(/ZZ/g, 'Z'))
> ZaZ

如果我们将\\a\\替换为Z替换为\\,则replace()

关于您的计数器示例,字符串在JavaScript中是不可变的,\\\\a\\不会更改原始字符串中的任何内容,您需要记录原始字符串。

这当然与\\a\不一样,因为这个表单是需要为特殊字符转义字符串的程序表单,它的长度是4而不是7。因为那里不需要反斜杠,所以你在控制台得到{{1}}。