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\
,这是正确的。
答案 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}}。