大多数情况下,我们使用正则表达式替换字符串段,当替换的文本是一个变量时,基本上程序员是不知道的。
然而我们总是忘记,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()方法也是如此)。
所以请你推荐一些更通用的解决方案来解决这个问题。
如果你只想用指定的文字替换序列替换一个特定的子串,你可以简单的使用 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。