【问题标题】:Extract a substring by using regex doesn't work使用正则表达式提取子字符串不起作用
【发布时间】:2015-06-19 08:37:16
【问题描述】:

我有一个这样的字符串:

String source = "https://1116.netrk.net/conv1?prid=478&orderid=[6aa3482b-519b-4127-abee-debcd6e39e96]"

我想提取 [ ] 内的 orderid。我写了这个方法:

public String extractOrderId(String source)
{
    Pattern p = Pattern.compile("[(.*?)]");
    Matcher m = p.matcher(source);
    if (m.find())
        return m.group(1);
    else
        return "";
}

但我总是得到异常

java.lang.IndexOutOfBoundsException: No group 1

知道有什么问题吗?谢谢

【问题讨论】:

    标签: java regex string text-extraction


    【解决方案1】:

    你需要转义括号:

    Pattern p = Pattern.compile("\\[(.*?)\\]");
    

    【讨论】:

    • 你需要转义正则表达式...不是java字符串..更像"\\[(.*?)\\]"
    • @AbishekManoharan,你说得对,它适用于 "\[(.*?)\]"
    • 抱歉,关于转义的一些困惑 ;-)
    • 谢谢 Abishek - 答案已修复。
    【解决方案2】:

    除了使用正则表达式之外,您还可以使用 URL 类来提取查询:

    URL url = new URL("https://1116.netrk.net/conv1?prid=478&orderid=[6aa3482b-519b-4127-abee-debcd6e39e96]");
    String query = url.getQuery();
    

    此时查询的值为prid=478&orderid=[6aa3482b-519b-4127-abee-debcd6e39e96]。从那里您可以通过indexOfsubstring 的组合轻松提取orderid

    String searchFor = "orderid=[";
    int fromIndex = query.indexOf(searchFor);
    int toIndex = query.indexOf("]", fromIndex);
    
    //6aa3482b-519b-4127-abee-debcd6e39e96
    String orderId = query.substring(fromIndex+searchFor.length(), toIndex);
    

    【讨论】:

      【解决方案3】:

      您的正则表达式缺少\\

      Pattern p = Pattern.compile("\\[(.*?)]");
      

      【讨论】:

        【解决方案4】:

        您需要为 [] 使用转义字符,请尝试以下操作

        Pattern p = Pattern.compile("\\[(.*)\\]");
        

        【讨论】:

          【解决方案5】:

          您已使用[(.*?)]。方括号的含义请参考this

          所以在这种情况下,您还需要为字符 [] 定义正则表达式。所以你需要从Pattern.compiler 中转义这些字符。

          以下内容将符合您想要的要求。

          Pattern p = Pattern.compile("\\[(.*?)\\]");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-14
            • 2016-01-02
            相关资源
            最近更新 更多