【问题标题】:Replace all "(" and ")" in a string in Java用Java替换字符串中的所有“(”和“)”
【发布时间】:2012-09-05 05:07:35
【问题描述】:

如何在Java中用句号替换字符串中的所有“(”和“)”?我尝试了以下方式:

String url = "https://bitbucket.org/neeraj_r/url-shortner)";
url.replaceAll(")", ".");
url.replaceAll(")", ".");

但它不起作用。错误是:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing
')'
 )
at java.util.regex.Pattern.error(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 com.azzist.cvConversion.server.URLChecker.main(URLChecker.java:32)

我认为这个问题也会出现在所有正则表达式中。在) 之前添加\ 无效。

【问题讨论】:

  • 添加 \\ 而不是 \ 。您需要添加两个双斜杠

标签: java regex string replaceall


【解决方案1】:

您可以一次性使用 replaceAll:

url.replaceAll("[()]", ".")

解释:

  • [()] 匹配 (),括号不需要在 [] 组内转义。

编辑(正如@Keppil 指出的那样):

还要注意,字符串 url 不会被替换更改,它只是返回一个带有替换的新字符串,所以你必须这样做:

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

【讨论】:

    【解决方案2】:

    您需要分别使用"\\(""\\)" 转义'('')'

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

    【讨论】:

    • 你的回答有一个小错误。您只是替换“)”。但这也行不通。您的逻辑不适用于 "("。url = url.replaceAll("\(", "."); 不会替换 "("
    • 它使用 java 1.8+ 工作。需要在 ( 和 ) 前面添加 2 个反斜杠 \\。 url = url.replaceAll("\\)", ".");不错
    【解决方案3】:

    replaceAll() 期望 regex 作为第一个参数,并且括号在那里具有特殊含义。

    改用replace()

    String url = "https://bitbucket.org/neeraj_r/url-shortner)";
    url = url.replace("(", ".").replace(")", ".");
    

    请注意,url = 部分对于保存替换结果很重要。由于Strings 是不可变的,因此原始String 不会更改,但会创建一个新的String。要保留结果url 需要改为指向这个。

    【讨论】:

    • 'url.replace("(",".") 和 url.replaceAll("\(",".") 工作正常。这里的重点是 "url = url.replace( ...)”。在问题中缺少“url = ...”。因此字符串将被替换但不会写在某处。
    • @emempe:是的,这也很重要,但是 OP 示例中的错误是由于正则表达式错误。我也会添加关于url = 部分的注释。
    • @Keppil 我想转换字符串中的所有“(”。通过使用.replace,我想我只能转换第一次出现。
    • @Neeraj:不,replace() 负责所有这些。
    【解决方案4】:
    1. 字符串是不可变的。
    2. ) 应使用 2 个反斜杠进行转义。

    所以代码看起来像这样:

    String url = "https://bitbucket.org/neeraj_r/url-shortner)";
    // is you need to escape all of them, use "[()]" pattern, instead of "\\)"
    String s = url.replaceAll("\\)", "."); 
    System.out.println(url);
    System.out.println(s);
    

    还有输出:

    https://bitbucket.org/neeraj_r/url-shortner)
    https://bitbucket.org/neeraj_r/url-shortner.
    

    【讨论】:

      【解决方案5】:

      添加单个 \ 将不起作用,因为这会尝试将 \) 评估为转义的特殊字符,而事实并非如此。

      您需要使用“\)”。第一个 \ 转义第二个,产生一个“正常”\,然后转义 ),产生一个与右括号 ) 完全匹配的正则表达式。

      通用解决方案是使用Pattern.quote,它接受任意字符串并返回与该字符串完全匹配的正则表达式。

      【讨论】:

        【解决方案6】:

        您也可以使用不使用正则表达式的 org.apache.commons.lang.StringUtils.replace(String, String, String)

        来自 apache 公共库 http://commons.apache.org/

        【讨论】:

          【解决方案7】:

          方法String#replaceAll 需要一个正则表达式,而() 是特殊字符(标记组),因此您需要将它们转义为非特殊url.replaceAll("\\)", ".");

          您还可以将这两个字符同时替换为模式url.replaceAll("[()]", ".");。您可以看到,在这种情况下,括号没有被转义。这是因为正则表达式上下文 - 在 [] 内部,它们没有任何特殊含义。

          查看JavaDoc 了解更多信息。

          【讨论】:

            【解决方案8】:

            因为) 是正则表达式的字符,所以你需要转义它。试试这个:

            url.replaceAll("\)", "\.");
            

            【讨论】:

              【解决方案9】:

              使用

              url.replaceAll("\\)", ".").replaceAll("\\(", ".");;
              

              【讨论】:

                猜你喜欢
                • 2013-12-31
                • 2011-11-11
                • 2013-01-04
                • 1970-01-01
                • 2013-11-05
                • 2015-05-01
                • 1970-01-01
                • 2011-06-09
                相关资源
                最近更新 更多