正则表达式用于从名称和电子邮件字符串中提取全名

时间:2014-06-19 04:45:57

标签: regex language-agnostic

从像这样的字符串中提取全名的正则表达式是什么?

string = "Jim jim@example.com John Doe john@doe.com Dr. Jane Doe jane3@doe.co Jeff H. P. O'Doe jeff.h@doe_doe.fm"

我需要结果:

Jim, John Doe, Dr. Jane Doe, Jeff H. P. O'Doe

如果电子邮件放在括号中,我已经找到了解决方案,但在这种情况下,电子邮件不在括号中。

这是我目前的进展:

/\b(?<!@)([a-zA-Z'.]+\s[a-zA-Z'.]+\s[a-zA-Z'.]+(?!@)\b|[a-zA-Z'.]+\s[a-zA-Z'.]+(?!@)\b)/

这不是很好,因为它只会考虑两到三个字长的名字,它仍会捕获.com或.whatever来自电子邮件。

2 个答案:

答案 0 :(得分:1)

诀窍:分裂与匹配

如果您尝试匹配文本,这是其中一个难以理解的问题。诀窍是匹配电子邮件和相邻的空格,并分开。您可以使用此正则表达式进行拆分:

(?i)\s*\b[A-Z0-9._%+-]+@[A-Z0-9.-_]+\.[A-Z]{2,6}\b\s*
  • the demo中,彩色位是拆分分隔符:它们将被排除。
  • 正则表达式是一个匹配正则表达式的基本电子邮件(这个特殊的一个来自RegexBuddy库),锚定,每端添加\s*以占用任何额外的空格。

由于您与语言无关,因此在PHP中,请按照以下方式使用它:

$result = preg_split('/(?i)\s*\b[A-Z0-9._%+-]+@[A-Z0-9.-_]+\.[A-Z]{2,6}\b\s*/im', $str, 0);

如果您有任何问题,请与我们联系。

答案 1 :(得分:0)

使用此正则表达式;

[a-zA-Z.'\s]+(?=\s[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-_]+\.[a-zA-Z0-9-.]+\s*\K)

一个小错误是它与名字不匹配。也许你可以弄清楚什么是错的。

演示:http://regex101.com/r/sR9cD2