正则表达式提取链接内容

时间:2009-11-15 09:51:35

标签: java regex

我将是第一个承认我的正则表达式知识毫无希望的人。我正在使用带有以下

的java
Matcher m = Pattern.compile(">[^<>]*</a>").matcher(html);
while (m.find()) {
 resp.getWriter().println(html.substring(m.start(), m.end()));
}

我得到以下列表:

>Link Text a</a>
>Link Text b</a>

我删除了></a>

干杯。

5 个答案:

答案 0 :(得分:2)

您是否考虑过使用capturing group

Pattern.compile(">([^<>]*)</a>")

但是请注意,通常不推荐使用HTML的正则表达式,因为HTML不是常规的。通过使用JTidy等HTML解析器,您将获得更可靠的结果。

答案 1 :(得分:2)

请记住,由于其性质有限,如果您尝试解析的HTML稍微复杂一些,那么正则表达式(以及一般的正则表达式)可能会遇到问题。例如,以下内容无法正确解析,但完全有效(和常见)HTML:

<a href="blah.html">this is only a <em>single</em> link</a>

您可能最好使用DOM解析器(我很确定Java在这方面有很多选项),然后您可以请求每个<a>标记的内部文本。

答案 2 :(得分:2)

您可以通过在正则表达式的该部分周围打包一个组,然后使用group(X),其中X是该组的编号来执行此操作:

Matcher m = Pattern.compile(">([^<>]*)</a>").matcher(html);
while (m.find()) {
 resp.getWriter().println(m.group(1));
}

但是,更好的方法是使用一个简单的解析器:

import java.io.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class HtmlParseDemo {
   public static void main(String [] args) throws Exception {
       Reader reader = new StringReader("foo <a href=\"#\">Link 1</a> bar <a href=\"#\">Link <b>2</b> more</a> baz");
       HTMLEditorKit.Parser parser = new ParserDelegator();
       parser.parse(reader, new LinkParser(), true);
       reader.close();
   }
}

class LinkParser extends HTMLEditorKit.ParserCallback {

    private boolean linkStarted = false;
    private StringBuilder b = new StringBuilder();

    public void handleText(char[] data, int pos) {
        if(linkStarted) b.append(new String(data));
    }

    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        if(t == HTML.Tag.A) linkStarted = true;
    }

    public void handleEndTag(HTML.Tag t, int pos) {
        if(t == HTML.Tag.A) {
            linkStarted = false;
            System.out.println(b);
            b = new StringBuilder();
        }
    }
}

输出:

Link 1
Link 2 more

答案 3 :(得分:1)

我迟到了,但我想指出另一个选择:

(?<=X)      X, via zero-width positive lookbehind

如果你把你的初始>放入那个混乱中,即

(?<=>)[^<>]*</a>

然后不应该将其作为结果的一部分返回。

但是,未经测试。祝你好运!

答案 4 :(得分:0)

测试正则表达式的一种很好的快速方法是使用正则表达式编辑器,例如以下eclipse插件: http://brosinski.com/regex/