2013-12-12 27 views
17

我需要转义所有引号(“)的字符串,因此它成为\”的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 

我真的坚持在这里,希望有人能帮助我在这里。

感谢,

伊万

+0

可能重复的[取代()和的replaceAll()中的Java(http://stackoverflow.com/questions/12941266/replace-and-replaceall-in-java) – user2864740

+0

如果您还没有考虑到这一点,如果输入是以任何方式来自用户,那么您可能还需要先用双反斜杠替换任何反斜杠。就像用户输入''你'很棒''''',那么你现在就会''你'很棒'\''很棒''。由于用户输入的反斜杠在转义后逃避生成的反色,所以第三次引用没有转义。 – tobii

回答

26

你必须首先转义反斜线,因为它是一个文本(产生\\),然后再次逃跑,因为正则表达式(产生\\\\)的。所以,不妨试试:

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

输出:

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

Matcher.quoteReplacement(“\\'”)可用于引用替换字符串。 – isnot2bad

+2

@ isnot2bad我真的认为'Matcher.quoteReplacement'的用法几乎都是值得自己回答的。 (这是'quoteReplacement',而不是'quoteRegex'的原因。) – user2864740

+0

@ user2864740,请您详细说明一下。我已经用替换函数的字符序列来解释它,因为在这种情况下,我们不需要四个反斜杠,但只有两个作为'Nambari'回答。 – Sage

11

使用replace()

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

输出:

你\ '会是完全真棒,I \'我真的很可怕

+1

@BoristheSpider:replaceall()与replace()不同。我不认为OP需要这里的正则表达式。 – kosa

3

这并不是说如何“修复”的问题 - 这是已经在其他的答案进行;它是为了绘制细节和适用的文档参考。


当使用String.replaceAll或任何适用的匹配器代用品的,要注意替换字符串,它是如何处理的:

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

正如在评论中指出isnot2bad,Matcher.quoteReplacement可以在这里有用:

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

8

让我们的String#repalceAll(String regex, String replacement)

参观你会看到:

形式str.replaceAll(正则表达式,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 

但有时我们不想$是这种特殊的,因为我们要使用它作为简单的美元字符,所以我们需要一种方法来逃避它。
这里来\,因为既然是用来逃跑的正则表达式元字符的字符串,可能在其他地方是用在这里逃脱$好习惯。

所以现在\也是替换部分的元字符,所以如果你想简化\字面替换你需要以某种方式逃避它。你猜怎么着?你可以像使用正则表达式或字符串转义它一样逃避它。你只需要在你逃跑之前放置另一个\

所以,如果你想在替换零件中创建\,你需要在它之前添加另一个\。但请记住,写\在字符串文字,你需要把它写成"\\"因此要创建两个\\替代你需要把它写成"\\\\"


所以尽量

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

,甚至更好,减少明确逸出更换部件(也包括正则表达式的一部分 - 忘了提到,早期的),只要用replace代替replaceAll这增加了逃逸我们的

s = s.replace("'", "\\'"); 
相关问题