正则表达式在Java

时间:2015-11-11 02:21:46

标签: java regex

我编写了一个程序来查找HTML页面中的所有链接:

public static void main(String[] args) throws IOException {
    String base = "http://www.oracle.com/";
    URL url = new URL(base);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

    StringBuffer stringBuffer = new StringBuffer();
    String inputLine = null;
    while ((inputLine = in.readLine()) != null) {
        stringBuffer = stringBuffer.append(inputLine).append("\n");
    }

    Matcher matcher = Pattern.compile("<a .*href=\"([^\"]+)\".*</a>", Pattern.DOTALL).matcher(stringBuffer.toString());

    ArrayList<String> urlList = new ArrayList<>();
    while (matcher.find()){
        String relUrl = matcher.group(1);
        String fullUrl = relUrl.startsWith("/")?base+relUrl.substring(1):relUrl;
        urlList.add(fullUrl);
        System.out.println(fullUrl);
    }

    in.close();
}

出于某种原因,当我运行此代码时,它只匹配一个链接。但是,当我在没有DOTALL标志的情况下运行它时,它匹配108个链接。我添加DOTALL标记的原因是为了匹配a标记可能超过一行的链接,例如:

    <li><a data-lbl="solutions" href="https://www.oracle.com/solutions/index.html#menu-solutions" data-trackas="hnav" class="u01nav">
<h3>Solutions</h3>
</a></li>

根据here,正则表达式<a .*href=\"([^\"]+)\".*<\/a>与上面的HTML匹配。 (这与我在代码中使用的略有不同,因为Eclipse不会让我逃脱/字符)

1 个答案:

答案 0 :(得分:1)

由于你的正则表达式是贪婪的.*正则表达式匹配所有字符。所以让它变得非贪婪.*? ..

"<a .*?href=\"([^\"]+)\".*?</a>"

"<a [^<>]*\\bhref=\"([^\"]+)\".*?</a>"