我想要一个从字符串中提取电子邮件地址的正则表达式(使用 Java 正则表达式)。
这真的有效。
这是真正有效的正则表达式。我花了一个小时在网上冲浪并测试不同的方法,尽管谷歌在这些页面上排名第一,但其中大多数都不起作用。
我想与您分享一个有效的正则表达式:
[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0- 9]+)*(\\.[A-Za-z]{2,})
这是原始链接: http ://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/
我不得不添加一些破折号以允许它们。所以最终的结果是爪哇语:
final String MAIL_REGEX = "([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})";
将此正则表达式测试器插件安装到 Eclipse 中,您将拥有大量测试正则表达式
http://brosinski.com/regex/的时间。
注意事项:
在插件中,字符转义只使用一个反斜杠。但是,当您将正则表达式转录为 Java/C# 字符串时,您必须将它们加倍,因为您将执行两次转义,首先是从 Java/C# 字符串机制中转义反斜杠,然后是实际的正则表达式字符转义机制。
用圆括号/省略号包围您希望捕获其文本的正则表达式部分。然后,您可以使用 Java 或 C# 正则表达式中的组函数来找出这些部分的值。
([_A-Za-z0-9-]+)(\.[_A-Za-z0-9-]+) @([A-Za-z0-9]+)(\.[A-Za-z0 -9]+)
例如,使用上面的正则表达式,下面的字符串
abc.efg@asdf.cde
产量
start=0, end=16
Group(0) = abc.efg@asdf.cde
Group(1) = abc
Group(2) = .efg
Group(3) = asdf
Group(4) = .cde
组 0 始终是匹配的整个字符串的捕获。
如果您没有用省略号括起任何部分,您将只能检测到匹配但无法捕获文本。
创建几个正则表达式可能比创建一个长的包罗万象的正则表达式更容易混淆,因为您可以以编程方式一个一个地测试,然后决定应该合并哪些正则表达式。尤其是当您发现以前从未考虑过的新电子邮件模式时。
有点晚了,但还可以。
这是我使用的。只需将其粘贴到 FireBug 的控制台并运行它。在网页上查找“Textarea”(很可能在页面底部),它将包含在 A 标签中找到的所有电子邮件地址的分隔列表。
var jquery = document.createElement('script');
jquery.setAttribute('src', 'http://code.jquery.com/jquery-1.10.1.min.js');
document.body.appendChild(jquery);
var list = document.createElement('textarea');
list.setAttribute('emaillist');
document.body.appendChild(list);
var lijst = "";
$("#emaillist").val("");
$("a").each(function(idx,el){
var mail = $(el).filter('[href*="@"]').attr("href");
if(mail){
lijst += mail.replace("mailto:", "")+",";
}
});
$("#emaillist").val(lijst);
Java 的内置电子邮件地址模式 ( Patterns.EMAIL_ADDRESS
) 完美运行:
public static List<String> getEmails(@NonNull String input) {
List<String> emails = new ArrayList<>();
Matcher matcher = Patterns.EMAIL_ADDRESS.matcher(input);
while (matcher.find()) {
int matchStart = matcher.start(0);
int matchEnd = matcher.end(0);
emails.add(input.substring(matchStart, matchEnd));
}
return emails;
}