2010-01-09 54 views
20

在我的计划匹配问题,当我使用字符串模式在Java中

line.replaceAll("(", "_"); 

我有一个RuntimeException

at java.util.regex.Pattern.error(Unknown Source) 
at java.util.regex.Pattern.accept(Unknown Source) 
at java.util.regex.Pattern.group0(Unknown Source) 
at java.util.regex.Pattern.sequence(Unknown Source) 
at java.util.regex.Pattern.expr(Unknown Source) 
at java.util.regex.Pattern.compile(Unknown Source) 
at java.util.regex.Pattern.<init>(Unknown Source) 
at java.util.regex.Pattern.compile(Unknown Source) 
at java.lang.String.replaceAll(Unknown Source) 
at Processing.processEarly(Processing.java:95) 
at Processing.main(Processing.java:34) 

有什么原因吗?我们如何避免它?

回答

37

string.replaceAll的第一个参数是一个正则表达式,而不仅仅是一个字符串。开幕左括号是一个正则表达式特殊字符,所以你必须逃避它:或者

line.replaceAll("\\(", "_"); 

,因为要更换单个字符,你可以使用string.replace像这样:

line.replace('(', '_'); 
+0

感谢编辑劳伦斯! D'哦! – 2010-01-09 11:26:46

+5

'String.replace'也可以用于文字(非正则表达式)替换。 – McDowell 2010-01-09 11:35:46

+0

谢谢 - 添加到答案。 – 2010-01-09 11:41:31

2

的堆栈跟踪上述错误消息是(有点)有所帮助:

异常在线程 “主” java.util.regex.PatternSyntaxException: UNCL近索引1 ( ^

osed组(这是我在Java中6得到),它提到了 “正则表达式”, “组”,并且圆括号。如果你看不到这条消息,你应该检查你如何记录/捕获/显示异常。它可以在未来为您节省一些麻烦。

+0

+1教鱼如何。 – trashgod 2010-01-09 21:59:18