2012-01-19 21 views
1

我曾尝试使用以下类型的正则表达式的为什么心不是这个正则表达式回溯工作

([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))|(FakeEmail:)|(Email:)|(\1\2)|(\1\3) 

(假装\ 1是电子邮件正则表达式组,和\ 2 FakeEmail:和\ 3电子邮件:因为我没有算括号找出真正的分组)

我所试图做的是说“查找单词电子邮件:如果你找到它,拿起任何电子邮件地址字下面的”

该电子邮件正则表达式我得到了关于堆栈溢出的其他问题。

我的测试字符串可以是这样的

"This guy is spamming me from 
FakeEmail: [email protected] 
but here is is real info: 
Email: [email protected]" 

任何提示吗?谢谢

回答

0

我对你想要做什么感到困惑,或者你的正则表达式错了。特别是:

为什么你在最后有Email:而不是开头 - 来匹配你的例子?

你为什么把你的Email:和你的\1\2用管道字符分开,就好像它们在字段中一样?这是将该模式编译为OR。 (找到电子邮件模式,或“电子邮件:”,或任何\1\2将最终意义,因为它是在这里的背景)。

如果你所要做的只是匹配类似Email: [email protected],你不喜欢不需要任何回溯。

像这样的东西可能是你所需要的:

Email:\s+([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})) 

而且,我会强烈建议不要尝试这样严格验证的电子邮件地址。您可能想要阅读http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx。我想简化图案的线沿线的东西更多:

Email:\s+(\S+)*@(\S+\.\S+) 
+0

我修改的例子是更现实的。我有这样的正则表达式结构,因为我真的想尝试挑选出假冒和真正的电子邮件,重新使用电子邮件正则表达式 – Derek

0

尝试:

(Fake)?Email: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})) 

,抓获组\1将是空的,如果它是真实的电子邮件和遏制“假”,如果它是一个假电子邮件,而\2将是电子邮件本身。

你真的想捕捉它,如果它是FakeEmail有关系吗?如果你想捕获所有Email但忽略所有FakeEmail然后执行:

\bEmail: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})) 

字边界防止Email位从匹配“FakeEmail”。

UPDATE:注意你的正则表达式只是因为它有a-z[]无处不在,但不是[A-Z]匹配小写。确保使用忽略大小写开关将您的正则表达式提供给java匹配函数。即:

Pattern.compile("(Fake)?Email: .....", Pattern.CASE_INSENSITIVE) 
+0

我修改了这个例子,使其更加真实。我有这样的正则表达式结构,因为我真的想尝试挑选出假冒和真正的电子邮件,重新使用电子邮件正则表达式 – Derek

+0

好了,更新了答案。 –

+0

我最终想要捕捉所有的电子邮件 - 我只关心真正的电子邮件。此外,这似乎并没有工作 – Derek

0

您可以使用下面的代码来匹配所有类型的电子邮件地址:

String text = "This guy is spamming me from\n" + 
    "FakeEmail: [email protected]\n" + 
    "fakeEmail: \n" + 
    "[email protected]" + 
    "but here is is real info:\n" + 
    "Email: [email protected]\n"; 

Matcher m = Pattern.compile("(?i)(?s)Email:\\s*([_a-z\\d\\+-]+(\\.[_a-z\\d\\+-]+)*@[a-z\\d-]+(\\.[a-z\\d-]+)*(\\.[a-z]{2,4}))").matcher(text); 
while(m.find()) 
    System.out.printf("Email is [%s]%n", m.group(1)); 

这将匹配电子邮件正文:

  • 出现在不同线路上使用(?s)
  • 忽略使用案例比较(?i)
  • 电子邮件广告在它

OUTPUT一段.在它

  • 电子邮件地址以加号+穿着:从上面的代码是

    Email is [[email protected]] 
    Email is [[email protected]] 
    Email is [[email protected]] 
    
  • 相关问题