大多数情况下我们使用正则表达式替换字符串段,当替换文本是一个变量时,程序员基本上是不知道的。
但是我们总是忘记,java matcher.replaceAll() 的行为将非常依赖于替换本身。因此,替换不应包含任何 '$' 或 '\' 字符,以提供幼稚的结果。
例如,如果变量薪水等于“$2”,则以下代码将抛出“java.lang.IndexOutOfBoundsException: No group 2”。
String salary = "$2";
Pattern p = Pattern.compile("SAL");
Matcher m = p.matcher("Salary: SAL");
String s = m.replaceAll(salary);
System.out.println(s);
我知道,如果 '$' 符号用 '\' 转义,那么我们将得到预期的结果。但话又说回来,'\' 也应该用 '\' 转义。所以正确的解决方案是:
String salary = "$2";
Pattern p = Pattern.compile("SAL");
Matcher m = p.matcher("Salary: SAL");
String s = m.replaceAll(salary.replace("\\", "\\\\").replace("$", "\\$"));
System.out.println(s);
现在首先,这不是那么方便使用,而且在性能方面也不是很好。(这同样代表 appendReplacement() 方法。)
那么您能否为该问题推荐一些更通用的解决方案?