抓取url的正则表达式模式不起作用

时间:2013-12-05 12:15:12

标签: java regex

让我直截了当地解决我的问题。

public static final String EXAMPLE_TEST = "<span id=\"lblObject\"><a href=\"http://www.guideline.gov/content.aspx?id=15135\" alt=\"View object\">Manual medicine guidelines for musculoskeletal injuries.</a></span>";

    //public static final String EXAMPLE_TEST ="<a href=\"http://www.guideline.gov/content.aspx?id=1112\"></a>";
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("<a href=\"http://www.guideline.gov/content.aspx?id=(\\d+)\"");
        // in case you would like to ignore case sensitivity,
        // you could use this statement:
        // Pattern pattern = Pattern.compile("\\s+", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(EXAMPLE_TEST);
        // check all occurance
        while (matcher.find()) {
            System.out.print("Start index: " + matcher.start());
            System.out.print(" End index: " + matcher.end() + " ");
            System.out.println(matcher.group());
        }


    }

正则表达式存在一些问题。我使用的示例字符串只是一个虚拟字符串。实际上我将有一个html文件,其中有许多url链接具有以下模式http://www.guideline.gov/content.aspx?id=some_number。我需要从那个html文件中获取这些链接。请大家帮我看一下我的正则表达式错误。

4 个答案:

答案 0 :(得分:2)

问题是问号?是一个正则表达式,意思是“一个或没有”,但是你将它用作文字字符:你必须转义问号:

Pattern pattern = Pattern.compile("<a href=\"http://www.guideline.gov/content.aspx\\?id=(\\d+)\"");

这里的关键区别是:

...content.aspx\\?id...

注意问号前面的双反斜杠,这就是在java中为正则表达式编写单个反斜杠的方式,因此模式为...content.aspx\?id...

你的正则表达式没有问号,而是有{ - 1}}而不是x

你也应该逃避你的点,但它可能已经足够接近了。

答案 1 :(得分:2)

你可以这样引用你的正则表达式:

Pattern pattern = Pattern.compile("<a href=\"\\Qhttp://www.guideline.gov/content.aspx?id=\\E(\\d+)\"");
  

\ Q 告诉正则表达式引擎引用正则表达式的下一部分(即忽略任何元字符)
    \ E 告诉正则表达式引擎引用的部分已结束。

答案 2 :(得分:1)

使用以下程序。

String htmlText = "<span id=\"lblObject\"><a href=\"http://www.guideline.gov/content.aspx?id=15135\" alt=\"View object\">Manual medicine guidelines for musculoskeletal injuries.</a></span>";
    Pattern pattern = Pattern.compile( "href=\"(http://www.guideline.gov/content.aspx\\?id=.*?)\"" );

    Matcher matcher = pattern.matcher( htmlText );
    while ( matcher.find() )
    {
        String matchedText = matcher.group( 0 );
        Pattern p = Pattern.compile("href=\"(.*?)\"");
        Matcher m = p.matcher(matchedText);
        String url = null;
        if (m.find()) {
            url = m.group(1);
            System.out.println(url);
        }
    }

// output : http://www.guideline.gov/content.aspx?id=15135

答案 3 :(得分:0)

你的尝试几乎是正确的。你犯的唯一错误是不逃避?在.aspx?id=。如果您只想获取您的模式,那么您的模式也会包含一些信息(<a href=\"和最后\")。只获取URL的正确模式是

"http://www.guideline.gov/content.aspx\\?id=\\d+"

因此,使用以下代码段,您应该能够提取所有网址

Pattern pattern = 
              Pattern.compile("http://www.guideline.gov/content.aspx\\?id=\\d+");

Matcher matcher = pattern.matcher(htmlText);
while (matcher.find()) {
    // do something
}