【问题标题】:Regex for extracting full names from string of names and emails用于从姓名和电子邮件字符串中提取全名的正则表达式
【发布时间】:2014-08-09 12:58:14
【问题描述】:

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

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。

【问题讨论】:

  • 不要使用 a-zA-Z 等,因为它会在第一次遇到像 Al-Fayed 或 Müller 这样的名字时中断。您似乎通过包含' 处理了爱尔兰名字,但仅此而已。即使您的用户群以美国为中心,这也不是一个好习惯。虽然很多或在 40 年代和 50 年代移居的人确实改姓以对英语更友好,但现在移居那里的人很少这样做。

标签: regex language-agnostic


【解决方案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);

如果您有任何问题,请告诉我。

【讨论】:

  • 你好,跟进这个问题,这个答案是否解决了它,或者你有问题吗?
  • 啊哈...非常酷。那成功了。非常感谢@zx81 ...如果我有声望点,我会支持你。
【解决方案2】:

使用这个正则表达式;

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

一个小错误是它与名字不匹配。也许你能找出问题所在。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多