正则表达式匹配<a> tag</a>

时间:2011-11-05 04:24:55

标签: java html regex

我正在为一个类编写一个小的java程序,我无法弄清楚为什么我的正则表达式无法正常工作。在读入的同一行上有2个标签的特殊情况下,它只匹配第二个。

这是一个包含正则表达式的链接,以及一组简单的测试数据: Regex Test Link

在我的java程序中,我有以下代码:

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
String[] results;
System.out.println(p.toString());
Matcher m = null;

while((line = input.readLine()) != null) {
    m = p.matcher(line);
    while(m.find()) {
        System.out.println("Matches: " + m.group(1));
    }
}

目标是提取href值,只要它以http://开头,网站就会以无页面结束(如http://www.google.com)或以index.htm或index.html结尾(如http://www.google.com/index.html)。

我的正则表达式适用于上述每种情况,但在同一行的2个标签的特殊情况下不匹配。

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

只需使用正确的HTML解析库,例如HTML cleaner。从理论上讲,用正则表达式正确地解析HTML是不可能的 - 有太多的结构会让它混淆。例如:

<![CDATA[ > <a href="http://foo.com">bar</a> ]]>

这不是链接。这是XHTML中的文字文本。

<a href="http://bar.com/?<a href=http://foo.com>bar</a>">baz</a>

这只是一个链接。

<a rel="next" href="bar?2">Next</a>

这是具有关系属性和相对URI的链接的实际示例。

<a name="foo">The href="http://example.com" part is the link destination...</a>

这是一个命名锚,而不是一个链接。但是,你的正则表达式会将这里的文字文本解析为链接。

<a
href="http://example.com">Foo</a>

你的正则表达式是否正确处理了生成链接的链接?

可能会出现各种其他Fun edge案例。节省时间和头痛。这些问题已经解决并包含在漂亮整洁的库中供您使用。利用这一点。

正则表达式可能是一个强大的工具,但正如他们所说 - 当你拥有的只是一把锤子时,一切看起来都像钉子。你现在正试图用螺丝钉敲打。

答案 1 :(得分:0)

这在我的正则表达式测试页面

中对我有用
<a[^>]*>[^<]*</a>

答案 2 :(得分:0)

Regex Solution

所以我一直在玩,并意识到我的问题。我调整了一下我的正则表达式。我的主要问题是在开始时我的。*导致所有内容匹配到最后一个标记,因此它实际上只匹配一次而不是两次。我做到了。*懒惰,它匹配两次而不是一次。这是唯一的问题。一旦将正则表达式添加到java中,我的循环代码就可以正常工作。

谢谢大家的回应。虽然你可能没有提供答案,但你的评论让我思考正确的方向!

答案 3 :(得分:-1)

您必须查看每行所有匹配项,并找到哪一个看起来像一个网址(比如更多正则表达式);)