为什么replaceAll会抛出异常

时间:2013-08-31 20:17:03

标签: java regex

我有一个字符串,我想摆脱括号

这是我的字符串"(name)" 我想得到"name"

没有括号的同样的事情

我有String s = "(name)";

我写了

s = s.replaceAll("(","");
s = s.replaceAll(")","");

我得到了一个例外

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 1
(

如何摆脱括号?

6 个答案:

答案 0 :(得分:7)

括号字符()分隔正则表达式中capturing group的边界,该表达式用作replaceAll中的第一个参数。角色需要转义。

s = s.replaceAll("\\(","");
s = s.replaceAll("\\)","");

更好的是,你可以简单地将括号放在character class中以防止字符被解释为元字符

s = s.replaceAll("[()]","");

答案 1 :(得分:4)

s = s.replace("(", "").replace(")", "");

这里不需要正则表达式。

如果您想使用正则表达式(不知道为什么会这样),您可以这样做:

s = s.replaceAll("\\(", "").replaceAll("\\)", "");

问题是()是元字符,因此您需要将它们转义(假设您希望它们被解释为它们的显示方式)。

答案 2 :(得分:3)

String#replaceAll将正则表达式作为参数。 您正在使用Grouping Meta-characters作为正则表达式参数。这就是获取错误的原因。

  

元字符用于对模式进行分组,划分和执行特殊操作。

\       Escape the next meta-character (it becomes a normal/literal character)
^       Match the beginning of the line
.       Match any character (except newline)
$       Match the end of the line (or before newline at the end)
|       Alternation (‘or’ statement)
()      Grouping
[]      Custom character class

所以使用
1。\\(代替(
2. \\)而不是)

答案 3 :(得分:2)

你需要像这样转义括号:

s = s.replaceAll("\\(","");
s = s.replaceAll("\\)","");

你需要两个斜杠,因为正则表达式处理引擎需要看\(来将括号作为文字括号处理(而不是正则表达式的一部分),你需要转义反斜杠因此正则表达式引擎可以将其视为反斜杠。

答案 4 :(得分:1)

你需要逃避(和)它们有特殊的字符串字面含义。 这样做:

s = s.replaceAll("\\(","");
s = s.replaceAll("\\)","");

答案 5 :(得分:1)

s=s.replace("(","").replace(")","");