我正在为一个类编写一个小的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个标签的特殊情况下不匹配。
感谢任何帮助。
答案 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)
所以我一直在玩,并意识到我的问题。我调整了一下我的正则表达式。我的主要问题是在开始时我的。*导致所有内容匹配到最后一个标记,因此它实际上只匹配一次而不是两次。我做到了。*懒惰,它匹配两次而不是一次。这是唯一的问题。一旦将正则表达式添加到java中,我的循环代码就可以正常工作。
谢谢大家的回应。虽然你可能没有提供答案,但你的评论让我思考正确的方向!
答案 3 :(得分:-1)
您必须查看每行所有匹配项,并找到哪一个看起来像一个网址(比如更多正则表达式);)