我几乎有这个工作,但并不完全。
我有一个JavaScript字符串,其中包含每个格式不同的电子邮件列表(没有新行,为了易读性而编辑):
var emailList = 'peter@pan.com,
lucky <jack@pot.com>,
"William Tell" <billy@tell.com>,
"John Rambo, III" <johnny@rambo.com>,
"there, might, be, several, commas inside the quotes" <multiple@commas.com>,
"yes, this is also a valid email address, can you believe" <yes@this@is@valid.com>'
首先,我需要将此字符串拆分为不同的电子邮件。电子邮件由', '
分隔:
peter@pan.com, lucky <jack@pot.com>
但', '
也可能出现在引号括起的名称中:
"John Rambo, III" <johnny@rambo.com>
甚至可以在引号内找到多个逗号:
"there, might, be, several, commas inside the quotes" <multiple@commas.com>
第1步:替换引号中的
,
我想用逗号替换<<<<!!!!>>>>
我已经尝试了这个正则表达式:(".*)(,)(\s.*"), $1<<<<!!!!>>>>$3
https://regex101.com/r/baha69/1/但它并没有替换引号中的逗号......: - (
第2步:拆分数组和撤消逗号替换
现在可以在JavaScript中轻松完成分割和替换:
var Array = emailList.split(', ');
Array.forEach(function(element, index, arr) {
arr[index] = element.replace("<<<<!!!!>>>> ", ", ");
});
此时,我应该有一个这样的数组(没有新行,为了易读性而编辑):
Array[0] = 'peter@pan.com'
Array[1] = 'lucky
<jack@pot.com>'
Array[2] = '"William Tell"
<billy@tell.com>'
Array[3] = '"John Rambo, III"
<johnny@rambo.com>'
Array[4] = '"there, might, be, several, commas inside the quotes
<multiple@commas.com>'
Array[5] = '"yes, this is also a valid email address, can you believe"
<yes@this@is@valid.com>'
第3步:拆分电子邮件地址
现在我必须将每封电子邮件转换为基本组件(没有新行,为了易读性而编辑):
Array[0] = {fullName: '',
firstWord: '', localPart: 'peter', company: 'pan',
email: 'peter@pan.com'}
Array[1] = {fullName: 'lucky',
firstWord: 'lucky', localPart: 'jack', company: 'pot',
email: 'jack@pot.com'};
Array[2] = {fullName: 'William Tell',
firstWord: 'William', localPart: 'billy', company: 'tell',
email: 'billy@tell.com'};
Array[3] = {fullName: 'John Rambo, III',
firstWord: 'John', localPart: 'johnny', company: 'rambo',
email: 'johnny@rambo.com'};
Array[4] = {fullName: 'there, might, be, several, commas inside the quotes',
firstWord: 'there', localPart: 'multiple', company: 'commas',
email: 'multiple@commas.com'};
Array[5] = {fullName: 'yes, this is also a valid email address, can you believe',
firstWord: 'yes', localPart: 'yes@this@is', company: 'valid',
email: 'yes@this@is@valid.com'};
为此,我将使用以下RegExps:
var firstWord = element.match('/"?(\w*),? .*"?/ig')[1];
这个有效!! :-) https://regex101.com/r/6Z481l/1
var fullName = element.match('/"?(.*)"? </ig')[1];
这个DOESN&#39; T work:捕获尾随&#34; :-( https://regex101.com/r/6Z481l/2
var localpart = element.match('/<(.*)@/ig')[1];
这个DOESN&#39; T:peter in peter @ pan未被捕获:-( https://regex101.com/r/6Z481l/3
var company = element.match('/@(.*)\./ig')[1];
这个有效!! :-) https://regex101.com/r/6Z481l/4
var email = element.match('/<(.*@.*)>|(^[^<].*[^>])/ig')[1];
令人惊讶的是,这有效!! :-)但我几乎可以肯定它可以变得更优雅 https://regex101.com/r/6Z481l/5
值得一提的是,电子邮件被认为是经过验证的
所以,我需要一些帮助来完成步骤1和3.如果步骤3中的任何正则表达式可以简化或更加优雅,我将从中学习!
不是目标,但是如果你拿出一个神奇的RegExp来分割电子邮件,就像我需要它一样,那么我可以保证你肯定会让我惊叹并让我感觉自己缺乏RegExp知识! ! : - )
谢谢!
答案 0 :(得分:1)
您可以用逗号分隔字符串,不包括this之类的引号中包含的字符:
,(?=(?:[^'"]|'[^']*'|"[^"]*")*$)
这应该可以让你摆脱第1步&amp; 2。
关于步骤3中的非功能性模式:
不起作用:捕获尾随“
(?|"(\[^"\]+)"|(.*) <)
:首先匹配平衡报价,或者<
之前的所有内容
警告:如果第1组为空,则必须检查第2组(不幸的是,JS没有branch reset组)。不起作用:未捕获peter @ pan中的peter
(<|^)(.*)@
:你可以从一开始就进行二次匹配;
然而,这很麻烦,因为图案没有正确固定。对于电子邮件验证部分,您应使用existing和recommended解决方案之一。但我猜这是另一个话题。
答案 1 :(得分:1)
我相信您应该能够使用正则表达式获得预期的最终结果:
(?:(?:"?((\w+)\b.*\b)"?)\s)?<?(([\w@]*)@(\w*)\.[a-zA-Z]{2,3})>?,?
并将其替换为:
{ fullName:'\1', firstWord:'\2', localPart:'\4', company:'\5', email:'\3'}