Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式匹配额外文本_Java_Regex_Jsoup - Fatal编程技术网

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

Java 正则表达式匹配额外文本,java,regex,jsoup,Java,Regex,Jsoup,我正在编写一个小程序,通过url查找电子邮件地址,但我的正则表达式似乎有问题。它多次打印出相同的内容,并匹配我不需要的文本 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(":mat

我正在编写一个小程序,通过url查找电子邮件地址,但我的正则表达式似乎有问题。它多次打印出相同的内容,并匹配我不需要的文本

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》……< BR> “Paul Boersma语音科学教授,阿姆斯特丹大学”……< BR> “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的事吗?可能与元素有关?

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

我可以为您提供两种选择:

1.使用特定的css查询 演示:

2.立即提取包含电子邮件的节点
演示:

我使用
模式解决了这个问题,而不是使用
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());
}

可能感兴趣的两个问题:、和(列在“常见验证任务”下)。我第一眼看到的唯一一件事是,许多电子邮件在at标志前都有点,你的regex不允许。谢谢你的帮助。虽然这似乎对我提供的url有效,但对另一个url无效。我最终使用Java中的模式类来查找匹配项,而不是Jsoup。我将以编辑的形式发布我的解决方案。@Pushkin其他url的问题可能来自regex。我相信我的regex是有效的,因为我已经在Notepad++中测试过它(它成功地匹配了模式),并且我在新的解决方案中使用了它(以编辑的形式发布),这也有效。您觉得正则表达式有什么突出的问题吗?@Pushkin新解决方案中使用的正则表达式与原始解决方案有很大的不同。我刚刚使用了\\s?我们试图简化。带\\s的那个?一些URL仍然存在问题,但使用模式类可以解决问题。
:matchesOwn([0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4})
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());
}