Java字符串ReplaceAll和ReplaceFirst在替换文本的$符号处失败

kam*_*aci 15 java regex replace

我写了这段代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是我运行时发生的事情:

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
Run Code Online (Sandbox Code Playgroud)

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

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

笔记:

  • 我不想检查每个角色逃脱.这就是我问这个问题的原因.

  • 我正在使用Java 6.

Jon*_*eet 30

String.replaceAll需要一个正则表达式匹配的图案作为第一个参数,和一个正则表达式替换作为其第二个参数图案-和$在正则表达式的特定含义(在两个匹配模式和替换模式,虽然在不同的感官).

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

编辑:至于你的问题:

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

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

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

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


Cor*_*all 6

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

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

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