首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个regexp回溯不起作用

为什么这个regexp回溯不起作用
EN

Stack Overflow用户
提问于 2012-01-19 11:56:11
回答 3查看 210关注 0票数 1

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

代码语言:javascript
复制
([_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是电子邮件:,因为我没有计算出真正的分组)

我要做的就是说“找到单词email:如果你找到了,就拿起这个单词后面的任何电子邮件地址。”

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

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

代码语言:javascript
复制
    "This guy is spamming me from
FakeEmail: fakeemailAdress@someplace.com
 but here is is real info:
Email: testemail@someplace.com"

有什么建议吗?谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-01-19 12:02:21

我要么对你想要做的事情感到困惑,要么你的Regex就是大错特错。特别是:

为什么你把Email:放在结尾,而不是开头--来匹配你的例子?

为什么您的Email:\1\2都用竖线字符分隔,就像它们在字段中一样?这就是将模式编译为OR。(找到电子邮件模式,或者单词" email :",或者任何\1\2最终的含义,因为它在这里脱离了上下文。)

如果你想要做的就是匹配像Email: testemail@someplace.com这样的东西,你不需要任何回溯。

这样的代码可能就是您需要的全部内容:

代码语言:javascript
复制
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。我将模式简化为更类似于以下内容的内容:

代码语言:javascript
复制
Email:\s+(\S+)*@(\S+\.\S+)
票数 0
EN

Stack Overflow用户

发布于 2012-01-19 12:03:02

尝试:

代码语言:javascript
复制
(Fake)?Email: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))

如果是真实的电子邮件,捕获的群组\1将为空,如果是假电子邮件,则包含" fake“,而\2将是电子邮件本身。

但是,如果它是FakeEmail,你真的想捕获它吗?如果您想要捕获所有Email,但忽略所有FakeEmail,则执行以下操作:

代码语言:javascript
复制
\bEmail: *([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))

字边界阻止Email位与"FakeEmail“匹配。

更新:注意,您的正则表达式只匹配小写,因为它在[] everywhere中有a-z,而不是[A-Z]。确保使用ignore case开关将正则表达式提供给java匹配函数。即:

代码语言:javascript
复制
Pattern.compile("(Fake)?Email: .....", Pattern.CASE_INSENSITIVE)
票数 0
EN

Stack Overflow用户

发布于 2012-01-19 13:00:54

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

代码语言:javascript
复制
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)忽略大小写比较
  • 电子邮件地址中带有.句点
  • 带有加号+的电子邮件地址

输出:上面的代码是

代码语言:javascript
复制
Email is [fakeemail+Adress@someplace.com]
Email is [fakeemail@someplace.comb]
Email is [test.email+info@someplace.com]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8920828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档