正则表达式匹配额外的文本

时间:2014-04-22 00:22:21

标签: java regex jsoup

我正在编写一个小程序,找到给定网址的电子邮件地址,但我的正则表达式似乎有问题。它打印出多次同样的东西,并且匹配我不想要的文字。

Cleaner cleaner = new Cleaner(Whitelist.basic());
String url = "http://www.fon.hum.uva.nl/paul/";
Document doc = cleaner.clean(Jsoup.connect(url).get());
Elements emails = doc.select(":matches(" + 
                "[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4}"
                +")");
for (Element e : emails) {
   System.out.println(e.text());
}

我不会在这里发布完整的结果,因为它太长了,但它与电子邮件匹配,还有一堆不符合模式的重复文本。

“Paul Boersma阿姆斯特丹大学语音科学教授”...... “Paul Boersma阿姆斯特丹大学语音科学教授”...... “Paul Boersma阿姆斯特丹大学语音科学教授”......

有谁知道问题可能是什么? 它是正则表达式,还是与打印e.text()有关?

谢谢。

编辑:我还尝试了一个更复杂的表达方式:

[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,4})

但是我遇到了同样的问题。

编辑2:我在Notepad ++中使用了这个正则表达式,它似乎运行良好。我在匹配网页上的文字时只会遇到此问题。

编辑3:我尝试在regexplanet.com上运行它,有趣的是,它匹配正确。那么这就是Jsoup的事吗?可能与Elements有关的东西?

2 个答案:

答案 0 :(得分:1)

问题来自css查询。由于其中没有特定的节点,Jsoup倾向于带回整个节点的层次结构。你得到的是包含电子邮件及其所有祖先的节点,直到根节点(<html>)。

我可以为您看到两个选项:

1。使用特定的CSS查询

a:matches([0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4})

演示: http://try.jsoup.org/~fsXXqnQtTNEOSTR3TPvyONtWS64

2。提取包含电子邮件

的节点立即
:matchesOwn([0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4})

演示: http://try.jsoup.org/~RgbUgekyWIoSe5bvFhZdQju9ibM

答案 1 :(得分:0)

我使用Pattern而非JSoup解决了模式匹配问题:

Pattern pattern = Pattern.compile("[\\w-]+(\\.[\\w-]+)*\\s?@\\s?[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,4})");
Document doc = cleaner.clean(Jsoup.connect(url).get());
String text = doc.text();
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println(matcher.group());
}