【问题标题】:why does replaceAll throw an exception为什么replaceAll会抛出异常
【发布时间】:2013-09-04 08:01:24
【问题描述】:

我有一个字符串要去掉括号

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

同样的东西没有括号

我有String s = "(name)";

我写了

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

我得到了一个例外

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

如何去掉括号?

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 奇怪的是,我在这个答案上点击了大约 10 次才让我接受它..
    • SO上接受答复需要至少等待15分钟
    • 这很奇怪.. 为什么会这样?
    • 也许this 有答案...
    • 我在另一个线程中写了一个答案,比较 replaceAllreplace 这里:stackoverflow.com/a/50047372/245966 请注意,在许多情况下,您可能想要使用 replace,这要简单得多使用 replaceAll 还请注意,与 JavaScript 不同的是,在 Java 中 replace 会替换所有出现的位置,而不仅仅是第一个!
    【解决方案2】:

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

    这里不需要正则表达式。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      \ 转义下一个元字符(它变成一个普通/文字字符) ^ 匹配行首 .匹配任何字符(换行符除外) $ 匹配行尾(或在换行符之前) |交替(“或”语句) () 分组 [] 自定义字符类

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

      【讨论】:

        【解决方案4】:

        您需要像这样转义括号:

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

        您需要两个斜杠,因为正则表达式处理引擎需要看到 \( 才能将括号处理为文字括号(而不是作为正则表达式的一部分),并且您需要转义反斜杠,以便正则表达式引擎将能够将其视为反斜杠。

        【讨论】:

          【解决方案5】:

          您需要转义 ( 和 ) 它们具有特殊的字符串字面意义。 这样做:

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

          【讨论】:

          • 它不会修改自己,它会创建一个新的String
          • 是吗?让我检查一下。
          • 哦,对不起,我没有意识到。
          【解决方案6】:
          s=s.replace("(","").replace(")","");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-12
            • 2015-12-24
            • 2015-04-03
            相关资源
            最近更新 更多