String.replaceAll单反斜杠,带双反斜杠

Fra*_*eld 113 java escaping backslash replaceall

我正在尝试将其String \something\转换为String \\something\\使用replaceAll,但我不断遇到各种错误.我认为这是解决方案:

theString.replaceAll("\\", "\\\\");
Run Code Online (Sandbox Code Playgroud)

但这给出了以下例外:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 191

String#replaceAll()参数解释为正则表达式.该\是转义字符 Stringregex.你需要双重逃避正则表达式:

string.replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)

但是你不一定需要正则表达式,因为你想要一个完全逐字符替换,你不需要这里的模式.所以String#replace()应该足够了:

string.replace("\\", "\\\\");
Run Code Online (Sandbox Code Playgroud)

更新:根据评论,您似乎想要在JavaScript上下文中使用该字符串.您可能更好地使用它StringEscapeUtils#escapeEcmaScript()来覆盖更多角色.

  • 如果你无论如何都想使用`String#replaceAll()`,你可以用[Matcher#quoteReplacement()](http://docs.oracle.com/javase/7/docs/api/java/util /regex/Matcher.html#quoteReplacement(java.lang.String)): `theString.replaceAll("\\", Matcher.quoteReplacement("\\\\"));` (2认同)

Fab*_*eeg 14

为了避免这种麻烦,你可以使用replace(采用普通字符串)而不是replaceAll(采用正则表达式).您仍然需要转义反斜杠,但不是以正则表达式所需的狂野方式.


Psh*_*emo 8

TLDR:theString = theString.replace("\\", "\\\\");改为使用.


问题

replaceAll(target, replacement)使用正则表达式(正则表达式)语法target和部分用于replacement.

问题是\正则表达式中的特殊字符(它可以用来\d表示数字)和字符串文字(它可以用来"\n"表示行分隔符或\"转义双引号符号,通常表示字符串文字的结尾).

在这两种情况下,为了创建\符号,我们可以通过在它之前放置额外的东西来逃避它(使其成为文字而不是特殊字符)\(就像我们"通过字符串文字中的转义一样\").

因此,target表示\符号的正则表达式将需要保持\\,并且表示此类文本的字符串文字将需要看起来像"\\\\".

所以我们逃脱了\两次:

  • 一次在正则表达式 \\
  • 一次在String文字中"\\\\"(每个\都表示为"\\").

如果replacement \是特殊的话.它允许我们$通过$x符号来逃避其他特殊字符,允许我们使用正则表达式匹配的数据部分并通过捕获组索引保存x,就像"012".replaceAll("(\\d)", "$1$1")将匹配每个数字一样,将其置于捕获组1中并将$1$1其替换为两个副本(它将复制它)导致"001122".

所以,再次,让replacement表示\文字,我们需要用额外的逃避它,\这意味着:

  • 替换必须包含两个反斜杠字符 \\
  • 和String literal代表\\看起来像"\\\\"

但是因为我们想要replacement保留两个反斜杠,我们需要"\\\\\\\\"(每个\反射一个"\\\\").

所以版本replaceAll可以看起来像

replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)

更轻松的方式

做出来的生活更轻松Java提供的工具来自动跳脱文本targetreplacement零件.所以现在我们只关注字符串,忘记正则表达式语法:

replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
Run Code Online (Sandbox Code Playgroud)

在我们的情况下可以看起来像

replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
Run Code Online (Sandbox Code Playgroud)

更好

如果我们真的不需要正则表达式,那么语法支持就完全不需要replaceAll了.而是让我们使用replace.两种方法都将替换所有 target s,但replace不涉及正则表达式语法.所以你可以简单地写

theString = theString.replace("\\", "\\\\");
Run Code Online (Sandbox Code Playgroud)


sfu*_*ger 7

你需要在第一个参数中转义(转义)反斜杠,因为它是一个正则表达式.替换(第二个参数 - 参见Matcher#replaceAll(String))也有反斜杠的特殊含义,所以你必须将它们替换为:

theString.replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)