我试过使用以下类型的正则表达式
([_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"
任何提示?感谢
答案 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]