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.
在替换字符串中,$是一个特殊字符:它用于从您要替换的模式中获取匹配的组。您可以在此处阅读更多相关信息。
要解决此问题,您可以引用替换字符串以从$字符中删除所有特殊含义:
import java.util.regex.Matcher;
// ...
String output = template.replaceAll(pattern, Matcher.quoteReplacement("$ 100"));
Run Code Online (Sandbox Code Playgroud)