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()参数解释为正则表达式.该\是转义字符都 String和regex.你需要双重逃避正则表达式:
string.replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)
但是你不一定需要正则表达式,因为你想要一个完全逐字符替换,你不需要这里的模式.所以String#replace()应该足够了:
string.replace("\\", "\\\\");
Run Code Online (Sandbox Code Playgroud)
更新:根据评论,您似乎想要在JavaScript上下文中使用该字符串.您可能更好地使用它StringEscapeUtils#escapeEcmaScript()来覆盖更多角色.
TLDR:theString = theString.replace("\\", "\\\\");改为使用.
replaceAll(target, replacement)使用正则表达式(正则表达式)语法target和部分用于replacement.
问题是\正则表达式中的特殊字符(它可以用来\d表示数字)和字符串文字(它可以用来"\n"表示行分隔符或\"转义双引号符号,通常表示字符串文字的结尾).
在这两种情况下,为了创建\符号,我们可以通过在它之前放置额外的东西来逃避它(使其成为文字而不是特殊字符)\(就像我们"通过字符串文字中的转义一样\").
因此,target表示\符号的正则表达式将需要保持\\,并且表示此类文本的字符串文字将需要看起来像"\\\\".
所以我们逃脱了\两次:
\\"\\\\"(每个\都表示为"\\").如果replacement \是特殊的话.它允许我们$通过$x符号来逃避其他特殊字符,允许我们使用正则表达式匹配的数据部分并通过捕获组索引保存x,就像"012".replaceAll("(\\d)", "$1$1")将匹配每个数字一样,将其置于捕获组1中并将$1$1其替换为两个副本(它将复制它)导致"001122".
所以,再次,让replacement表示\文字,我们需要用额外的逃避它,\这意味着:
\\\\看起来像"\\\\"但是因为我们想要replacement保留两个反斜杠,我们需要"\\\\\\\\"(每个\反射一个"\\\\").
所以版本replaceAll可以看起来像
replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)
做出来的生活更轻松Java提供的工具来自动跳脱文本target和replacement零件.所以现在我们只关注字符串,忘记正则表达式语法:
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)
你需要在第一个参数中转义(转义)反斜杠,因为它是一个正则表达式.替换(第二个参数 - 参见Matcher#replaceAll(String))也有反斜杠的特殊含义,所以你必须将它们替换为:
theString.replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140218 次 |
| 最近记录: |