我正在编写一个小程序,找到给定网址的电子邮件地址,但我的正则表达式似乎有问题。它打印出多次同样的东西,并且匹配我不想要的文字。
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有关的东西?
答案 0 :(得分:1)
问题来自css查询。由于其中没有特定的节点,Jsoup倾向于带回整个节点的层次结构。你得到的是包含电子邮件及其所有祖先的节点,直到根节点(<html>
)。
我可以为您看到两个选项:
a:matches([0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4})
演示: http://try.jsoup.org/~fsXXqnQtTNEOSTR3TPvyONtWS64
:matchesOwn([0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4})
答案 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());
}