【发布时间】:2023-04-01 03:22:01
【问题描述】:
所以我刚刚遇到了一个很好的边缘情况,如果替换字符串中有 $ 或 \,则在 String 上执行 replaceAll 会阻塞。
为什么替换字符串不只是替换与我指定的正则表达式匹配的替换?我在这里对正则表达式有什么不了解的地方?
引用Oracle Java 7 Documentation:
public String replaceAll(字符串替换)
替换输入序列中匹配的每个子序列 具有给定替换字符串的模式。
此方法首先重置此匹配器。然后扫描输入 序列寻找模式的匹配。不是的字符 任何匹配的一部分都直接附加到结果字符串;每个 match 在结果中被替换字符串替换。这 替换字符串可能包含对捕获子序列的引用 在 appendReplacement 方法中。
请注意,替换中的反斜杠 (\) 和美元符号 ($) 字符串可能会导致结果与之前的结果不同 视为文字替换字符串。美元符号可能会被处理 作为对如上所述捕获的子序列的引用,以及 反斜杠用于转义替换中的文字字符 字符串。
【问题讨论】:
-
因为
$和\在正则表达式中被用作特殊字符,你必须在替换字符串中转义它们。 -
因为替换字符串能够反向引用匹配器模式中的匹配项(使用
$),因此您还需要处理` specially because it is used to escape$`字符(使它们成为文字而不是反向引用)。您实际上引用了文档中解释这一点的部分......