"安全方式 "使用java matcher.replaceAll() appendReplacement()

问题描述 投票:1回答:1

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

然而我们总是忘记,java matcher.replaceAll()的行为在很大程度上取决于替换本身。因此,替换文本不应该包含任何'$'或'\'字符,以提供一个简单的替换文本。憨厚 结果。

例如,以下代码在变量salary等于"$2 "的情况下,抛出 "java.lang.IndexOutOfBoundsException: No group 2" in case the variable salary equals "$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()方法也是如此)。

所以请你推荐一些更通用的解决方案来解决这个问题。

java replace escaping matcher metacharacters
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 是一个regex。

© www.soinside.com 2019 - 2024. All rights reserved.