Java:将所有'替换为字符串中的'

时间:2013-12-12 23:05:25

标签: java regex string replaceall

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

我尝试过使用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

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

谢谢,

伊万

6 个答案:

答案 0 :(得分:29)

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

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

<强>输出:

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

答案 1 :(得分:12)

使用replace()

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

输出:

  

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

答案 2 :(得分:9)

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

你会看到:

  

调用str.replaceAll(regex,repl)形式的此方法会产生与表达式

完全相同的结果      

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中编写\字面值,您需要将其写为"\\",以便创建两个\\替换,您需要将其编写为"\\\\"


所以试试

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

甚至更好

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

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

答案 3 :(得分:3)

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


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

  

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

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

  

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

答案 4 :(得分:1)

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

s = StringEscapeUtils.escapeJava(s);

答案 5 :(得分:0)

您可以使用apache的commons-text库(而不是commons-lang):

示例代码:

org.apache.commons.text.StringEscapeUtils.escapeJava(escapedString);

依赖性:

compile 'org.apache.commons:commons-text:1.8'

OR

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-text</artifactId>
   <version>1.8</version>
</dependency>