1

大多数情况下我们使用正则表达式替换字符串段,当替换文本是一个变量时,程序员基本上是不知道的。

但是我们总是忘记,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() 方法。)

那么您能否为该问题推荐一些更通用的解决方案?

4

1 回答 1

0

如果您只想用指定的文字替换序列替换特定的子字符串,您可以简单地使用String.replace(). 像这样:

  String source = "Salary: SAL";
  String target = "SAL";
  String salary = "$2";
  String result = source.replace(target, salary);
  System.out.println(result); // prints "Salary: $2"

值得注意的是,它只替换文字子字符串序列,如果target是正则表达式则不起作用。

于 2020-05-27T12:32:31.140 回答