16

我写了这段代码:

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。

4

5 回答 5

32

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

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

编辑:至于你的问题:

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

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

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

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

于 2013-01-04T07:18:46.677 回答
7

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

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

import java.util.regex.Matcher;
// ...
String output = template.replaceAll(pattern, Matcher.quoteReplacement("$ 100"));
于 2013-01-04T07:18:28.437 回答
2

$可以处理特殊字符的方法很简单。检查以下示例

public static void main(String args[]){
        String test ="Other company in $ city ";
        String test2 ="This is test company ";
        try{
            test2= test2.replaceFirst(java.util.regex.Pattern.quote("test"),  Matcher.quoteReplacement(test));
            System.out.println(test2);
            test2= test2.replaceAll(java.util.regex.Pattern.quote("test"),  Matcher.quoteReplacement(test));
            System.out.println(test2);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

输出:

This is Other company in $ city  company 
This is Other company in $ city  company 
于 2017-08-16T15:49:24.660 回答
1

试试这个

 String template = "The user has spent amount in a day";
 String pattern = "amount";
 String output = template.replaceAll(pattern, "\\$ 100");
 System.out.println(output);
于 2013-01-04T07:23:06.750 回答
0

$用于指定替换组的符号。你需要逃避它:

String output = template.replaceAll(pattern, "\\$ 100");
于 2013-01-04T07:20:47.510 回答