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 次 |
最近记录: |