我需要在字符串中转义所有引号('),因此它变为\'
我尝试过使用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
我们来看看String#repalceAll(String regex, String replacement)
你会看到:
调用str.replaceAll(regex,repl)形式的此方法会产生与表达式完全相同的结果
Pattern.compile(regex).matcher(str).replaceAll(repl)
那么让我们来看看qazxsw poi文档
请注意,替换字符串中的反斜杠(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("'", "\\'");
或任何适用的Matcher替换器时,请注意替换字符串及其处理方式:
请注意,替换字符串中的反斜杠(
String.replaceAll
)和美元符号(\
)可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。
正如isnot2bad在评论中指出的那样,$
在这里可能很有用:
返回指定String的文字替换String。 ..生成的字符串将匹配s中作为文字序列处理的字符序列。斜线(
Matcher.quoteReplacement
)和美元符号(\
)将没有特殊含义。
你也可以尝试使用像StringEscapeUtils这样的东西让你的生活更轻松:$
http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html