从JS中的字符串中提取姓名和电子邮件
Extract name and email from string in JS
如何从字符串中提取姓名和电子邮件,其中电子邮件以逗号分隔。
下面的 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
这是一个可能的答案:
(?:^|, *)(?![^",]+")(?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))<?(?<email>[^,>]*)>?
这是使用 ruby 正则表达式,并使用正向匹配来确定条目是否有名称。
(?:^|, *)
:从字符串的最前面开始,或者在一个,和多个空格之后
(?![^",]+")
:否定先行,如果有一些字符然后是"
,则中止匹配。这会阻止逗号在字符串中开始匹配。
(?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))
: 匹配名字:
(?=[^"<]+@)
如果@出现在引号或左大括号之前,它只是一个没有名字的电子邮件地址,所以不要匹配
(?![^"<]+@)"?(?<name>[^"<]*)"? *)
:否则,匹配名称(如果存在则跳过开始和结束引号
<?(?<email>[^,>]*)>?
: 匹配邮箱。
请注意,对于真正的工作,这将是一个糟糕的方法。正则表达式几乎无法理解,更不用说脆弱了。它也不完整,例如,如果您可以转义名称中的引号会怎样?
如果你真的需要它,我会为此编写一个专用的解析器。如果您只是想提取一些数据,那么正则表达式可能就足够了。
很难说数据会改变还是保持不变,但这是我的尝试:
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]);
}
如何从字符串中提取姓名和电子邮件,其中电子邮件以逗号分隔。
下面的 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
这是一个可能的答案:
(?:^|, *)(?![^",]+")(?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))<?(?<email>[^,>]*)>?
这是使用 ruby 正则表达式,并使用正向匹配来确定条目是否有名称。
(?:^|, *)
:从字符串的最前面开始,或者在一个,和多个空格之后(?![^",]+")
:否定先行,如果有一些字符然后是"
,则中止匹配。这会阻止逗号在字符串中开始匹配。(?:((?=[^"<]+@)|(?![^"<]+@)"?(?<name>[^"<]*)"? *))
: 匹配名字:(?=[^"<]+@)
如果@出现在引号或左大括号之前,它只是一个没有名字的电子邮件地址,所以不要匹配(?![^"<]+@)"?(?<name>[^"<]*)"? *)
:否则,匹配名称(如果存在则跳过开始和结束引号
<?(?<email>[^,>]*)>?
: 匹配邮箱。
请注意,对于真正的工作,这将是一个糟糕的方法。正则表达式几乎无法理解,更不用说脆弱了。它也不完整,例如,如果您可以转义名称中的引号会怎样?
如果你真的需要它,我会为此编写一个专用的解析器。如果您只是想提取一些数据,那么正则表达式可能就足够了。
很难说数据会改变还是保持不变,但这是我的尝试:
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]);
}