Java:用字符串替换字符串中的所有’

我需要在字符串中转义所有引号(’),因此它变为\’

我尝试过使用replaceAll,但它没有做任何事情。 出于某种原因,我不能让正则表达式工作。

我正在尝试

String s = "You'll be totally awesome, I'm really terrible"; String shouldBecome = "You\'ll be totally awesome, I\'m really terrible"; s = s.replaceAll("'","\\'"); // Doesn't do anything s = s.replaceAll("\'","\\'"); // Doesn't do anything s = s.replaceAll("\\'","\\'"); // Doesn't do anything 

我真的被困在这里,希望有人能在这里帮助我。

谢谢,

我要

你必须首先转义反斜杠,因为它是一个文字(产生\\ ),然后因为正则表达式(产生\\\\ )而再次转义它。 所以,试试:

  s.replaceAll("'", "\\\\'"); 

输出:

 You\'ll be totally awesome, I\'m really terrible 

使用replace()

  s = s.replace("'", "\\'"); 

输出:

你会非常棒,我真的太可怕了

让我们来看看String#repalceAll(String regex,String replacement)

你会看到:

调用str.replaceAll(regex,repl)forms的此方法会产生与表达式完全相同的结果

Pattern.compile(regex).matcher(str).replaceAll(repl)

让我们来看看Matcher.html#replaceAll(java.lang.String)文档

请注意,替换字符串中的反斜杠( \ )和美元符号( $ )可能会导致结果与将其视为文字替换字符串时的结果不同。 如上所述, 美元符号可被视为对捕获的子序列的引用反斜杠用于替换替换字符串中的文字字符

您可以看到replacement我们有特殊字符$ ,可以用作对捕获组的引用

 System.out.println("aHellob,aWorldb".replaceAll("a(\\w+?)b", "$1")); // result Hello,World 

但有时候我们不希望$变得如此特别,因为我们想将它用作简单的美元字符,所以我们需要一种方法来逃避它。
这里来了\ ,因为它用于在正则表达式,字符串和可能在其他地方转义元字符,所以在这里使用它来逃避$是一个很好的惯例。

所以现在\更换部分也是元字符,所以如果你想简单地替换它,你需要以某种方式逃避它。 你猜怎么着? 你以与在regex或String中转义它相同的方式逃避它。 你只需要在逃脱之前放置另一个\

因此,如果您想在替换部件中创建\ ,则需要在其之前添加另一个\ 。 但请记住,要在String中编写\ literal,您需要将其写为"\\"因此要创建两个\\替换,您需要将其写为"\\\\"


所以试试吧

 s = s.replaceAll("'", "\\\\'"); 

甚至更好

减少替换部分中的显式转义(以及正则表达式部分 – 忘记前面提到过)只需使用replace而不是replaceAll为我们添加正则表达式转义

 s = s.replace("'", "\\'"); 

这并没有说明如何“解决”问题 – 这已经在其他答案中完成了; 它的存在是为了提取细节和适用的文档参考。


使用String.replaceAll或任何适用的Matcher替换器时,请注意替换字符串及其处理方式:

请注意, 替换字符串中的反斜杠( \ )和美元符号( $ )可能会导致结果与将其视为文字替换字符串时的结果不同。 如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。

正如isnot2bad在评论中所指出的,Matcher.quoteReplacement在这里可能很有用:

返回指定String的文字替换String。 ..生成的String将匹配s中作为文字序列处理的字符序列。 斜杠( \ )和美元符号( $ )将没有特殊含义。

你也可以尝试使用像StringEscapeUtils这样的东西来让你的生活更轻松: http ://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html

 s = StringEscapeUtils.escapeJava(s);