我需要在字符串中转义所有引号('),因此它变为\'
我尝试过使用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 :(得分:29)
你必须首先转义反斜杠,因为它是一个文字(屈服\\
),然后由于正则表达式(屈服\\\\
)再次转义它。所以,试试:
s.replaceAll("'", "\\\\'");
<强>输出:强>
You\'ll be totally awesome, I\'m really terrible
答案 1 :(得分:12)
答案 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>