如何从字符串中提取姓名和电子邮件,其中电子邮件以逗号分隔。
下面的regex适用于个别电子邮件,但不适用于字符串中的电子邮件。
(?:"?([^"]*)"?\s)?(?:<?(.+@[^>]+)>?)
注意名称中的逗号。
johndoe@baidu.com, John <johndoe@google.com>, John D, A <johndoe@bing.com>, "John Doe , Yen" <johndoe@163.com>
输出:
Name: null
Email: johndoe@baidu.com
Name: John
Email: johndoe@google.com
Name: John D, A
Email: johndoe@bing.com
Name: John Doe , Yen
Email: johndoe@163.com
答案 0 :(得分:3)
很难判断数据是否会改变或保持不变,但这是我的尝试:
var re = /(?:"?([A-Z][^<"]+)"?\s*)?<?([^>\s,]+)/g;
while (m = re.exec(str)) {
if(m[1]) { m[1] = m[1].trim() }
console.log("Name: " + m[1]);
console.log("Email: " + m[2]);
}
答案 1 :(得分:0)
这是一个可能的答案:
(?:^|, *)(?![^",]+")(?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))<?(?<email>[^,>]*)>?
这是使用ruby正则表达式,并使用正向匹配来确定条目是否具有名称。
(?:^|, *)
:从字符串的前面开始,或者在一个和多个空格之后开始(?![^",]+")
:负向前瞻,如果有一些字符则中止匹配,然后是"
。这可以阻止逗号在字符串内开始匹配。 (?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))
:匹配名称:
(?=[^"<]+@)
如果@出现在引号或开括号之前,它只是一个没有名称的电子邮件地址,所以不匹配(?![^"<]+@)"?(?<name>[^"<]*)"? *)
:否则,匹配名称(如果存在,则跳过打开和关闭的引用<?(?<email>[^,>]*)>?
:匹配电子邮件。请注意,对于真正的工作,这将是一个糟糕的方法。正则表达式几乎是不可理解的,更不用说脆弱了。它也不完整,例如,如果您可以在名称中删除引号会发生什么?
如果你确实需要,我会为此编写一个专用的解析器。如果您只是想提取一些数据,那么正则表达式可能就足够了。