JavaScript和反斜杠替换

60

这是我的字符串:

var str = "This is my \string";

这是我的代码:

var replaced = str.replace("/\\/", "\\\\");

我无法使输出结果为:

"This is my \\string"

我已经尝试了我所能想到的所有正则表达式和替换值的组合。

非常感谢任何帮助!

9个回答

52

我被这个问题困扰了很久,所有的答案都坚称源字符串需要已经包含转义的反斜杠...但并不总是这种情况。

做这个......

var replaced = str.replace(String.fromCharCode(92),String.fromCharCode(92,92));

3
我不理解为什么,但这对我没有用。 这里是一个 jsfiddle,可以帮我看一下吗? https://jsfiddle.net/a2nsL4bv/ - Timar Ivo Batis
@TimarIvoBatis,我刚看到了你的这条评论,你需要转义反斜杠。https://dev59.com/jF3Va4cB1Zd3GeqPEdyQ - Lys
4
不确定为什么这个回答有49个赞。String.fromCharCode的调用是不必要的。问题在于问题中的字符串字面量"This is my \string"不包含任何反斜杠。你不能替换原本就不存在的内容。字符串变量str可能包含反斜杠,那么可以简单地像这样替换它们:str.replace(/\\/g, "\\\\")或者str.replaceAll("\\", "\\\\")。但是如果一开始就没有正确地书写文本(如问题描述中所示),那么这个答案就无法帮到你。 - Sebastian Simon
需要字符代码列表的人可以在这里找到:https://asecuritysite.com/coding/asc2 - Reynadan

50
该字符串并不包含反斜线字符,而是包含转义序列\s
var str = "This is my \\string";

如果你想要一个正则表达式,那么你应该使用正则表达式而不是字符串。

var replaced = str.replace(/\\/, "\\\\");

7
请注意,/g全局标志并非必需,但如果你想要替换每一个反斜杠,这就是如何做到的:var replaced = str.replace(/\/g, "\\")。 - David Hollowell - MSFT
在SQLite中,对我来说运行良好,可以使用JSON.stringify()来去除反斜杠。谢谢。 - Betini O. Heleno

13

问题在于你的第一行中的 \ 连接符甚至不能被识别。它认为反斜杠将标记转义序列,但 \s 不是一个转义字符,因此它被忽略了。你的 var str 被解释成只是 "This is my string"。尝试 str.indexOf("\\") - 你会发现它是-1,因为根本没有反斜杠。如果你控制 str 的内容,请按照 David 的建议添加另一个 \ 来转义第一个。


问题在于我无法控制这个值。实际上,我正在处理一个Windows路径(\wp-content\photos\image123.jpg)。字符串以"\wp-content\photos\image123.jpg"的形式给出,但是我无法对其进行任何操作,因为反斜杠会消失。我知道它们被解析为转义字符,但我不知道如何修复它。 - Frankie
1
无论是你得到了损坏的JS(在这种情况下你无法修复它),还是你得到了其他语言的字符串并且在输出到JS之前没有转义特殊字符,那么你就必须在那里修复它。 - Quentin
同意 - 转义序列进入字符串的唯一方式是在JavaScript中构造字符串。如果它来自表单字段、ajax响应、查询字符串等,它不应该需要转义。当你说“字符串是以...的形式提供给我的”时 - 它实际上是如何提供给你的? - Graza
@Tesserex 我尝试了 str.indexOf("\"),结果得到了一个嵌套着带有反斜杠的 json-string 的 json-string。这真的很烦人... - meadlai

7

var a = String.raw`This is my \string`.replace(/\\/g,"\\\\");
console.log(a);

结果:

This is my \\string

5
如果您有多个实例或反斜杠:
str.split(String.fromCharCode(92)).join(String.fromCharCode(92,92))

1

我认为混淆是来自于字符串在浏览器控制台中的显示方式。(我刚刚检查了Chrome)

let myString = "This is my \string";

这里的 myString 实际上不包含任何反斜杠字符。它包含解析为 s\s 序列。

因此,如果您在控制台中显示字符串:

> myString => 
"This is my string"

> console.log(myString) 
This is my string

下面的字符串中只有一个反斜杠:

let myString = "This is my \\string";


//string representation includes the escape char as well. So we see double backslashes.  
> myString => 
"This is my \\string" 

//When you print it, the escape char is not there. 
> console.log(myString) 
This is my \string 

所以,如果你想用两个反斜杠替换反斜杠字符,你可以这样做:

let myNewStringWith2Backslashes= myString.replace("\\","\\\\")

1
使用此代码。
str.replace(/(\s)/g,function($0){return $0==' '?' ':'\\s'})

或者

str.replace(/ /g,'something').replace(/\s/g,'\\s').replace(/something/g,' ');

'something'可能是一个不在字符串中的字符组合

var str=' \s';  
  str.replace(/\s/g,'\\s'); 
// return '\\s\\s'   
  str.replace(/ /g,'SpAcE').replace(/\s/g,'\\s').replace(/SpAcE/g,' ');
// return ' \\s' 

-1
如果使用情况是替换函数的toString中的某些值,并将字符串转换回有效函数。
var exFnStr1 = exFn.toString();

var exFnStr = "";
var quoteStarted = false;
for(i = 0; i < exFnStr1.length; i++) {
    var iChar = exFnStr1.charAt(i);
    var oChar = exFnStr1.charAt(i);
    var currentCharCode = exFnStr1.charCodeAt(i);
    if(quoteStarted) {
        if(currentCharCode === 9) oChar = "tabChar";
        if(currentCharCode === 10) oChar = "newlineChar";
    }
    //console.log(iChar+"->"+currentCharCode+"->"+oChar)
    exFnStr += oChar;

    if(currentCharCode === 34) {
        if(quoteStarted) quoteStarted = false;
        else quoteStarted = true;
    }
}
console.log(exFnStr);

//TODO - replace values in the string

exFn = new Function('return ' + exFnStr)();

-2

我没有尝试过这个,但是以下的应该可以工作

var replaced = str.replace((new RegExp("\s"),"\\s");

实际上,您不想替换“\”,而是要替换由“\s”转义序列表示的字符。

不幸的是,为了涵盖所有情况,您需要针对字母表中的每个字母、每个数字、符号等进行此操作。


2
"\s" 是 "s",所以这将获取任何其他的 s 字符。你最终会在字符串中的每个字符前加上 "",除非该序列是控制字符。 - Quentin

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