str.replace("[\\]+", "\")问题很少,
-
replace 不使用正则表达式(replaceAll 使用)所以"[\\]" 将代表[\] 文字,而不是\ 或\\(取决于你认为它代表什么)
- 即使它确实接受正则表达式
"[\\]" 也不是正确的正则表达式,因为 \\] 会转义 ] 所以你最终会得到未封闭的字符类 [..
- 它不会编译(你的替换字符串没有关闭)
它不会编译,因为\ 是转义序列\X 的开始,其中X 必须是其中一个
- 从 String 特殊字符更改为简单文字,例如在您的情况下,
\" 将转义 " 为文字(例如,您可以打印它)而不是字符串的开始/结束,
- 从普通字符更改为特殊字符,例如行分隔符
\n\r 或制表符\t。
现在我们知道\ 是特殊的,用于转义其他字符。那么你认为我们需要做什么才能让\ 代表文字(当我们想要打印\ 时)。如果您猜想它需要用另一个 \ 转义,那么您是对的。要创建 \ 字面量,我们需要将其写入 String 为 "\\"。
既然您知道如何创建包含 \ 文字(转义的 \)的字符串,您就可以开始考虑如何创建替换。
代表一个或多个\的正则表达式看起来像
\\+
但这是它的原生形式,我们需要使用 String 来创建它。我在这里使用了\\,因为在正则表达式中\ 也是特殊字符(例如\d 代表digits,而不是\ 文字后跟d)所以它也需要转义首先表示 \ 文字。就像在 String 中一样,我们可以用另一个 \ 转义它。
所以表示这个正则表达式的字符串需要写成
"\\\\+"(我们转义了两次\,一次在正则表达式\\+,一次在字符串中)
您可以将它用作replaceAll 的第一个参数(因为前面提到的replace 不接受正则表达式)。
现在您将面临的最后一个问题是replaceAll 方法的第二个参数。如果你写
replaceAll("\\\\+", "\\")
它会找到匹配的正则表达式,你会看到异常
java.lang.IllegalArgumentException: character to be escaped is missing
这是因为在replacement 部分(replaceAll 方法中的第二个参数)我们还可以使用特殊公式$x,它表示来自索引为x 的组的当前匹配。因此,为了能够将$ 转义为文字,我们需要一些转义机制,这里再次使用\ 来达到此目的。 所以\ 也是我们方法的替换部分。
所以再次创建\ 文字,我们需要用另一个\ 对其进行转义,表示表达式\\ 的字符串文字是"\\\\"。
但是让我们回到之前的异常:消息“要转义的字符丢失”指的是\X 公式的X 部分(X 是我们想要转义的字符)。问题是您之前的替换 "\\" 仅代表 \ 部分,因此此方法期望 $ 创建 \$ 或 \\ 创建 \ 文字。所以有效的替换是"\\$ 或"\\\\"。
要使事情正常工作,您需要将替换方法编写为
str = str.replaceAll("\\\\+", "\\\\")