为什么这个正则表达式回溯不起作用

时间:2012-01-19 03:56:11

标签: java regex

我试过使用以下类型的正则表达式

([_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: fakeemailAdress@someplace.com
 but here is is real info:
Email: testemail@someplace.com"

任何提示?感谢

3 个答案:

答案 0 :(得分:0)

我对你要做的事情感到很困惑,或者你的正则表达式是非常错误的。特别是:

为什么你的Email:在最后而不是开头 - 与你的榜样相匹配?

为什么您的Email:\1\2由管道字符分隔,几乎就像它们在字段中一样?这是将模式编译为OR。 (找到电子邮件模式,或“电子邮件:”这个词,或者\1\2最终意味着什么,因为它在这里不合时宜。)

如果您要做的只是匹配Email: testemail@someplace.com之类的内容,则不需要任何回溯。

这样的事情可能就是你所需要的:

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+)

答案 1 :(得分: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”。

更新:请注意,您的正则表达式仅匹配小写,因为a-z到处都有[][A-Z]。确保使用ignore case开关将正则表达式提供给java匹配函数。即:

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

答案 2 :(得分:0)

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

String text = "This guy is spamming me from\n" +
    "FakeEmail: fakeemail+Adress@someplace.com\n" +
    "fakeEmail: \n" +
    "fakeemail@someplace.com" +
    "but here is is real info:\n" +
    "Email: test.email+info@someplace.com\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)
  • 忽略大小写比较
  • 其中包含句点.的电子邮件地址
  • 带有加号+的电子邮件地址

输出:来自上面的代码是

Email is [fakeemail+Adress@someplace.com]
Email is [fakeemail@someplace.comb]
Email is [test.email+info@someplace.com]