使用正则表达式从URL中提取字符串

时间:2013-12-26 19:48:07

标签: java regex

我正在调试一段代码,其中给出以下字符串

" http://www.xyz.com/classid/17950142?type=mandatory"

应该提取"classid/""?type=mandatory"之间显示的数字(即数字17950142

使用以下常规expressoin

完成此操作
Pattern.compile("^.*" + "http://www.xyz.com/classid/" + "([0-9]+)", Pattern.CASE_INSENSITIVE)

几个问题:

  • 上面的reqular表达式总是返回NULL即。我传递字符串http://www.xyz.com/classid/17950142?type=mandatory时没有匹配。究竟是什么" ^。*"意思?
  • 使用上面的表达式,它如何知道跳过?人物及其后的一切。

根据我通过googling找到的参考表,^。*基本上意味着匹配字符串开头的任何字符序列,在上面的示例中可能为空。

在java字符串连接发生后,表达式本身看起来像这样。

 ^.*http://www.xyz.com/classid/([0-9]+)

为什么上述内容与字符串http://www.xyz.com/classid/17950142?type=mandatory

不匹配

以下是我尝试在Java中运行模式的方法:

Matcher m = PATTERN.matcher(http://www.xyz.com/classid/17950142?type=mandatory);

        if(m.matches()) {
            return m.group(1);
        }

更新

谢谢所有回答。有趣的是,当我使用正则表达式测试程序在线测试时,它似乎正如我期待的那样工作。即使表达式和字符串相同,它也只是在Java中工作。

在此处查看示例 http://regexr.com?37pu3

由于

3 个答案:

答案 0 :(得分:2)

您在正则表达式结束时遗漏了$。试试这个:

String url = "http://www.xyz.com/classid/17950142?type=mandatory";

// ^.*http://www\.xyz\.com/classid/([0-9]+).*$
Pattern regex = Pattern.compile("^.*" + "http://www\\.xyz\\.com/classid/" + "([0-9]+)" + ".*$", Pattern.CASE_INSENSITIVE);    

Matcher matcher = regex.matcher(url);

if (matcher.matches())
    System.out.println(matcher.group(1));

注意:

  • ^是一个特殊字符,意味着该模式将开始查看字符串的开头
  • $^相反,意味着它会一直查到字符串的结尾
  • 网址上的.?字符需要转义。
  • ^http://www\.xyz\.com/classid/(\d+).*$这样的正则表达式更有意义,因为你从头开始检查模式

答案 1 :(得分:1)

^。*可能是^ - 字符串的开头,。* - 任何字符的0或更多。

表达式将所有内容与一个后跟数字的网址匹配:([0-9]+)

所以它只是意味着它将匹配以数字结尾的字符串,而不关心之后发生的任何事情。

答案 2 :(得分:1)

看起来问题不在于模式,但我会建议对它进行一些小的修改。

  1. 由于您知道您希望域名元素之间存在句点,因此您应该将其转义并使其成为字面句点。你是否真的需要^。*在很大程度上取决于URL在你匹配的字符串中的显示方式:

    Pattern p = Pattern.compile("^.*http://www\.xyz\.com/classid/([0-9]+)");
    
  2. 您对模式的使用应该是这样的:

    Matcher m = p.matcher("http://www.xyz.com/classid/17950142?type=mandatory");
    
  3. 然后,您可以继续使用条件语句。

    使用您原来的方法,但概括了URL模式,我能够得到这个来抓取数字:

        Pattern p = Pattern.compile("http://\\S+/([0-9]+)\\?.*");
        Matcher m = p.matcher("http://www.ncbi.nlm.nih.gov/pubmed/17950142?dopt=abstract");
        if (m.matches()) {
            System.out.println(m.group(1));
        }