Regex Java First字母不包含在正确的组中?

时间:2012-03-25 23:33:17

标签: java regex

我正在学习正则表达式,我无法理解Java中的分组。 目前我的正则表达式是

([^:]?)(?![email])(\w+[\. ]?\w+)\ ?\@[\. ]?(\w+\.?\w+)\.edu

我的目标是提取各种格式的电子邮件地址。与此无关的字符串行的示例是:

To get on the vcode mailing list, please email engler@lcs.mit.edu.

我的表达式匹配正确的字符串,但

group(1) = e
group(2) = ngler

我想要的是

group(2) = engler

适用于其他字符串,例如href =" mailto:balaji@stanford.edu">

感谢您抽出宝贵时间帮助我。 顺便说一句,我使用http://www.regexplanet.com/advanced/java/index.html来帮助我,它将正则表达式转换为java理解的表达式,并向您显示分组。

谢谢你Affe

答案:( [^:]?)\ b(?!(电子邮件))\ b(\ w + [。]?\ w +)\?\ @ [。 ]?(\ w +。?\ w +)。edu,我不知道它是由角色对待的,谢谢。

3 个答案:

答案 0 :(得分:1)

表达式[email]是一个字符类。它匹配字母e,m,a,i或l中的任何一个。它与“电子邮件”一词不匹配。那只是没有括号的电子邮件。这就是为什么它在engler中拿起e。

答案 1 :(得分:1)

请尝试使用此正则表达式:

([^:]?)(?<=email\s)(\w+[\. ]?\w+)\ ?\@[\. ]?(\w+\.?\w+)\.edu

我已将Negative Lookahead更改为正向Lookbehind,因为您想要声明字符email(带有空格 - 我为此添加了\s)应该在匹配之前。< / p>

我还从[]删除了email括号,因为它匹配了电子邮件中的任何字符并打破了您的群组(正如@Affe和@phatfingers所指出的那样)

答案 2 :(得分:0)

可以在此处找到使用正则表达式捕获电子邮件地址的非常好的描述:How to Find or Validate an Email Address

解析电子邮件地址是学习正则表达式的一个非常复杂的问题。你可能会从几个更简单的问题开始,这些问题的规则可以更容易明确。