String.replaceAll反斜杠双反斜杠
我试图将String
\something\
转换为String
\\something\\
使用replaceAll
,但我不断收到各种错误。 我认为这是解决scheme:
theString.replaceAll("\\", "\\\\");
但是,这给出了以下例外:
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
String#replaceAll()
将参数解释为正则expression式 。 \
是String
和regex
一个转义字符。 你需要双重转义为正则expression式:
string.replaceAll("\\\\", "\\\\\\\\");
但是你并不一定需要这样的正则expression式,因为你需要一个完整的逐个字符的replace,而且这里不需要模式。 所以String#replace()
应该足够了:
string.replace("\\", "\\\\");
更新 :根据评论,你似乎想要在JavaScript上下文中使用该string。 你最好使用StringEscapeUtils#escapeEcmaScript()
来代替更多的字符。
为了避免这种麻烦,你可以使用replace
(它使用一个普通的string)而不是replaceAll
(它需要一个正则expression式)。 你仍然需要避开反斜杠,但是不能用正则expression式所要求的方式。
因为它是一个正则expression式,您需要在第一个参数中转义(转义)反斜杠。 replace(第二个参数 – 见Matcher#replaceAll(String) )也有反斜杠的特殊含义,所以你必须把它们replace成:
theString.replaceAll("\\\\", "\\\\\\\\");
replaceAll(target, replacement)
对target
使用正则expression式(regex)语法,部分用于replacement
。
问题是\
是正则expression式中的特殊字符(如\d
代表数字)和string文字(如\n
创build行分隔符或\"
代表双引号符号),并创build\
符号,我们需要转义在这两个级别之前的额外“ \
。
所以要创build将代表\
符号的target
正则expression式,我们需要两次转义它:
- 在正则expression式
\\
- string文字
"\\\\"
(每个\
需要自己的额外\
之前)。
在replacement
\
情况下,也是特殊的有逃脱另一个特殊字符是$
。 通过$x
符号,正则expression式匹配的部分数据可以被replace访问和重用,比如replaceAll("(\d)", "$1$1")
将会复制每个数字。
所以再次,有一个 \
replacement
我们需要代表两个反斜杠的文本:
-
\\
- 但代表
\\
string文字看起来像"\\\\"
但是因为我们想把两个 \
replace"\\\\\\\\"
所以我们需要"\\\\\\\\"
(两个"\\\\"
)。
replaceAll("\\\\", "\\\\\\\\");
为了让生活变得更简单,Java提供了将文本自动转义为target
和replacement
部分的工具。 所以现在我们只能关注string,忘记正则expression式语法:
replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
在我们的例子中可能看起来像
replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
甚至更简单,如果我们不想使用正则expression式让我们不涉及replaceAll
,而是让我们使用replace
(这两种方法将取代所有的target
,但第二个不涉及正则expression式语法)。 所以你可以简单地写
theString = theString.replace("\\", "\\\\")
是的…在正则expression式编译器看到你给出的模式的时候,它只能看到一个反斜杠(因为Java的词法分析器已经把双反转变成了单一的反斜杠)。 你需要用"\\\\"
replace"\\\\"
,不要相信! Java真的需要一个很好的原始string语法。