String.replaceAll反斜杠双反斜杠

我试图将String \something\转换为String \\something\\使用replaceAll ,但我不断收到各种错误。 我认为这是解决scheme:

 theString.replaceAll("\\", "\\\\"); 

但是,这给出了以下例外:

 java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 

String#replaceAll()将参数解释为正则expression式 。 \Stringregex一个转义字符。 你需要双重转义为正则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提供了将文本自动转义为targetreplacement部分的工具。 所以现在我们只能关注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语法。