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

时间:2013-01-04 07:16:36

标签: 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);
}

当我运行它时会发生这种情况:

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.

5 个答案:

答案 0 :(得分:29)

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

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

编辑:关于你的问题:

  

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

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

  

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

试试这个

 String template = "The user has spent amount in a day";
 String pattern = "amount";
 String output = template.replaceAll(pattern, "\\$ 100");
 System.out.println(output);

答案 3 :(得分:1)

特殊字符$可以通过简单的方式处理。 请查看以下示例

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 

答案 4 :(得分:0)

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

String output = template.replaceAll(pattern, "\\$ 100");