Java 用于匹配电子邮件的正则表达式也匹配URL

Java 用于匹配电子邮件的正则表达式也匹配URL,java,regex,Java,Regex,我正在尝试编写一个正则表达式,用于提取多种形式的电子邮件: user@domain.com , user@sub.domain.com,域.com上的用户,域.com上的用户 这是我的照片(我知道很天真): 这与我想要的匹配,但也与URL匹配。如何排除URL匹配?我认为这部分 (\w+(?:\.|\s*dot\s*)) 负责URL匹配。检查本教程-考虑以下元素: (?:@?|(at)?|(\s*at\s*)?|(\(at\))?) 简而言之,您有太多的?s,这样一个完全空的字符串将匹配其中的

我正在尝试编写一个正则表达式,用于提取多种形式的电子邮件:

user@domain.com , user@sub.domain.com,域.com上的用户,域.com上的用户

这是我的照片(我知道很天真):

这与我想要的匹配,但也与URL匹配。如何排除URL匹配?

我认为这部分

(\w+(?:\.|\s*dot\s*))
负责URL匹配。

检查本教程-

考虑以下元素:

(?:@?|(at)?|(\s*at\s*)?|(\(at\))?)
简而言之,您有太多的
s,这样一个完全空的字符串将匹配其中的几个,这样就根本不需要匹配
(at)
@
at


因为您已经用
s分隔了分支,所以不需要用
s将单个分支标记为不必要的——只需要其中一个分支匹配,但该分支应该是非可选的。

您的问题是非捕获组
(?:@?(at)?|(\s*at\s*)((at))?
。有了所有的
s,您可以完全选择任何匹配。将该部分替换为:

(?:@|at|\(at\))

谷歌!找到一个
\b[A-Z0-9.\u%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
只需编辑带有选项的
@
部分即可。@Nishant如果他用现有组替换该正则表达式中的
,他就会破坏它,也是——他的一个更大的错误就在那一部分。@Nishant是真的,但我想学习如何手工制作并揭示我的错误。我不是在找菜谱。学习很好。:)我只是在暗示缩短解决方案。我认为这个问题很好。
(?:@|at|\(at\))