2012-03-25 71 views
0

我在学习正则表达式,我无法理解Java中的分组。 目前我正则表达式表达正则表达式Java第一个字母不包含在正确的组中?

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

我的目标是,有各种形式的提取电子邮件地址。不以这方面的工作线串的一个例子是:

To get on the vcode mailing list, please email [email protected] 

我表达正确的字符串,但

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

比赛我要的是

group(2) = engler 

它的工作原理对于其他字符串,如href =“mailto:[email protected]”>

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

谢谢您是Affe

答:([^:]?)(?!(电子邮件))([] \ w + \ W +?)\ B \ b \ \ @? ]?(\ w +。?\ w +)。edu,我不知道它被人物对待,谢谢。

+0

究竟是什么规则(抽象地)决定是否应该提取的东西?刚开始阅读你的正则表达式,即使是第一部分(选项非冒号?)让我想知道你的标准是什么。 – 2012-03-25 23:36:27

+0

单词“email”的方括号将使你的正则表达式捕获集合{e,m,a,i,l}中的一个字符。我不认为这是你的意图。 – phatfingers 2012-03-25 23:42:56

+0

@Ben Lee我试图提取任何包含任何抽象形式的电子邮件的字符串。比如机器人技术jks;斯坦福; edu,我应该能够在一个组中提取jks,在另一个组中提供robotics.stanford。他们有很多奇怪的形式,我正在参加一门课程。如果你有任何建议,我可以提高我的正则表达式的自由分享,因为我仍然是新的和学习。 – Miles 2012-03-26 00:14:34

回答

1

表达式[email]是一个字符类。它匹配字母e,m,a,i或l中的任何一个。它不符合“电子邮件”一词。这只是没有括号的电子邮件。这就是为什么它会吸引工程师。因为你要断言字符email

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

我已经改变了负向前查找到正回顾后(中间有空格 - 我加了这个\s)应:

+0

@Miles请注意,如果您只是删除括号'[]',则您的正则表达式在整个比赛中也会包含电子邮件。这可能对你需要的东西没有问题,但是如果你想删除它,请检查我的答案,下面应该解决它。 – Robbie 2012-03-25 23:59:07

1

试试这个正则表达式,而不是在比赛之前。

我也删除[]支架从email,因为这是从匹配字电子邮件的任何字符,并破坏你的团体(如由@Affe指出并@phatfingers)

0

捕捉E-一个相当不错的说明电子邮件地址与正则表达式可以在这里找到:How to Find or Validate an Email Address

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