String.将所有单反斜杠替换为双反斜杠
我试图将 转换为 using ,但我不断收到各种错误。我以为这就是解决方案:String
\something\
String
\\something\\
replaceAll
theString.replaceAll("\\", "\\\\");
但这给出了以下例外:
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
我试图将 转换为 using ,但我不断收到各种错误。我以为这就是解决方案:String
\something\
String
\\something\\
replaceAll
theString.replaceAll("\\", "\\\\");
但这给出了以下例外:
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
String#replaceAll()
将参数解释为正则表达式。和 中都是转义字符。您需要为正则表达式双重转义它:\
String
regex
string.replaceAll("\\\\", "\\\\\\\\");
但是你不一定需要正则表达式,仅仅是因为你需要一个精确的逐个字符替换,而且你在这里不需要模式。所以 String#replace()
应该就足够了:
string.replace("\\", "\\\\");
更新:根据注释,您似乎希望在JavaScript上下文中使用该字符串。你也许最好使用StringEscapeUtils#escapeEcmaScript()
来覆盖更多的字符。
TLDR:改用。theString = theString.replace("\\", "\\\\");
replaceAll(target, replacement)
对 使用正则表达式(正则表达式)语法,并对 部分使用正则表达式 (正则表达式) 语法。target
replacement
问题是正则表达式中的特殊字符(它可以像表示数字一样使用)和字符串文本中(它可以像表示行分隔符或转义双引号符号一样使用,这通常表示字符串文本的结尾)。\
\d
"\n"
\"
在这两种情况下,为了创建符号,我们可以通过在它之前放置addifer来转义它(使其成为文字而不是特殊字符)(就像我们通过在字符串文字中转义一样)。\
\
"
\"
所以要表示符号的正则表达式需要保持,而表示此类文本的字符串文字将需要看起来像。target
\
\\
"\\\\"
所以我们逃脱了两次:\
\\
"\\\\"
\
"\\"
如果是的话,那里也很特别。它允许我们通过符号转义其他特殊字符,允许我们使用由正则表达式匹配的部分数据,并通过捕获分组索引来保存,例如将匹配每个数字,将其放在捕获组1中,并将其替换为其两个副本(它将复制它)导致。replacement
\
$
$x
x
"012".replaceAll("(\\d)", "$1$1")
$1$1
"001122"
所以再一次,为了让表示文字,我们需要用附加来逃避它,这意味着:replacement
\
\
\\
\\
"\\\\"
但是,由于我们要保留两个反斜杠,因此我们需要(每个反斜杠由一个表示)。replacement
"\\\\\\\\"
\
"\\\\"
所以版本可以看起来像replaceAll
replaceAll("\\\\", "\\\\\\\\");
为了使生活更轻松,Java提供了自动将文本转义到和部分中的工具。所以现在我们可以只关注字符串,而忘记正则表达式语法:target
replacement
replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
在我们的例子中,它可能看起来像
replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
如果我们真的不需要正则表达式语法支持,那就完全不涉及了。相反,让我们使用 .这两种方法都将替换所有 s,但不涉及正则表达式语法。所以你可以简单地写replaceAll
replace
target
replace
theString = theString.replace("\\", "\\\\");