String.将所有单反斜杠替换为双反斜杠

2022-08-31 08:22:12

我试图将 转换为 using ,但我不断收到各种错误。我以为这就是解决方案:String\something\String\\something\\replaceAll

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

但这给出了以下例外:

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

答案 1

String#replaceAll() 将参数解释为正则表达式。和 中都是转义字符。您需要为正则表达式双重转义它:\Stringregex

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

但是你不一定需要正则表达式,仅仅是因为你需要一个精确的逐个字符替换,而且你在这里不需要模式。所以 String#replace() 应该就足够了:

string.replace("\\", "\\\\");

更新:根据注释,您似乎希望在JavaScript上下文中使用该字符串。你也许最好使用StringEscapeUtils#escapeEcmaScript()来覆盖更多的字符。


答案 2

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


问题

replaceAll(target, replacement)对 使用正则表达式(正则表达式)语法,并对 部分使用正则表达式 (正则表达式) 语法。targetreplacement

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

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

所以要表示符号的正则表达式需要保持,而表示此类文本的字符串文字将需要看起来像。target\\\"\\\\"

所以我们逃脱了两次:\

  • 一次在正则表达式中\\
  • 在字符串文本中一次(每个都表示为 )。"\\\\"\"\\"

如果是的话,那里也很特别。它允许我们通过符号转义其他特殊字符,允许我们使用由正则表达式匹配的部分数据,并通过捕获分组索引来保存,例如将匹配每个数字,将其放在捕获组1中,并将其替换为其两个副本(它将复制它)导致。replacement\$$xx"012".replaceAll("(\\d)", "$1$1")$1$1"001122"

所以再一次,为了让表示文字,我们需要用附加来逃避它,这意味着:replacement\\

  • 替换必须包含两个反斜杠字符\\
  • 和字符串文本,表示看起来像\\"\\\\"

但是,由于我们要保留个反斜杠,因此我们需要(每个反斜杠由一个表示)。replacement"\\\\\\\\"\"\\\\"

所以版本可以看起来像replaceAll

replaceAll("\\\\", "\\\\\\\\");

更简单的方法

为了使生活更轻松,Java提供了自动将文本转义到和部分中的工具。所以现在我们可以只关注字符串,而忘记正则表达式语法:targetreplacement

replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))

在我们的例子中,它可能看起来像

replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))

甚至更好

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

theString = theString.replace("\\", "\\\\");