Java 字符串替换全部和替换第一个在替换文本处以 $ 符号失败

2022-09-03 03:57:54

我写了这个代码:

public static void main(String args[]) throws Exception {
    String template = "The user has spent amount in a day";
    String pattern = "amount";
    String output = template.replaceAll(pattern, "$ 100");
    System.out.println(output);
}

这是我运行它时发生的情况:

Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
        at java.util.regex.Matcher.appendReplacement(Matcher.java:713)
        at java.util.regex.Matcher.replaceAll(Matcher.java:813)
        at java.lang.String.replaceAll(String.java:2190)
        at demo.BugDemo.main(BugDemo.java:16)
Java Result: 1

我正在从文件中读取数据。我应该转义文件数据中的所有符号,还是这是一个不必要的过程?是否有任何其他类或库来处理这种情况?$

在替换文本(而不是正则表达式中)中使用特殊符号有什么问题?

笔记:

  • 我不想检查每个角色来逃避。这就是为什么我要问这个问题。

  • 我使用的是Java 6。


答案 1

String.replaceAll 将正则表达式匹配模式作为其第一个参数,将正则表达式替换模式作为其第二个参数 - 并且在正则表达式中具有特定含义(在匹配模式和替换模式中,尽管含义不同)。$

只需使用String.replace代替,我怀疑你所有的问题都会消失。你应该只使用当你真正通过正则表达式匹配/替换 - 我认为在这种情况下你不会这样做。replaceAll

编辑:至于你的问题:

在替换文本(而不是正则表达式中)中使用特殊符号有什么问题?

同样,的文档清楚地说明了这一点:replaceAll

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;看。如果需要,用于禁止显示这些字符的特殊含义。Matcher.replaceAllMatcher.quoteReplacement(java.lang.String)

因此,如果要将匹配模式视为正则表达式,而不是替换,请使用 .Matcher.quoteReplacement


答案 2

在替换字符串中,是一个特殊字符:它用于从要替换的模式中抓取匹配的组。您可以在此处阅读更多相关信息。$

要解决此问题,您可以引用替换字符串以从字符中删除所有特殊含义:$

import java.util.regex.Matcher;
// ...
String output = template.replaceAll(pattern, Matcher.quoteReplacement("$ 100"));