我写了这段代码:
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.
答案 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");