RegExp用于将电子邮件列表拆分为基本组件(JavaScript)

时间:2018-04-21 23:56:46

标签: javascript regex split

我几乎有这个工作,但并不完全。

我有一个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知识! ! : - )

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以用逗号分隔字符串,不包括this之类的引号中包含的字符:

,(?=(?:[^'"]|'[^']*'|"[^"]*")*$)

这应该可以让你摆脱第1步&amp; 2。

关于步骤3中的非功能性模式:

  

不起作用:捕获尾随“

  • (?|"(\[^"\]+)"|(.*) <):首先匹配平衡报价,或者<之前的所有内容 警告:如果第1组为空,则必须检查第2组(不幸的是,JS没有branch reset组)。
  

不起作用:未捕获peter @ pan中的peter

  • (<|^)(.*)@:你可以从一开始就进行二次匹配; 然而,这很麻烦,因为图案没有正确固定。

对于电子邮件验证部分,您应使用existingrecommended解决方案之一。但我猜这是另一个话题。

答案 1 :(得分:1)

我相信您应该能够使用正则表达式获得预期的最终结果:

(?:(?:"?((\w+)\b.*\b)"?)\s)?<?(([\w@]*)@(\w*)\.[a-zA-Z]{2,3})>?,?

并将其替换为:

{ fullName:'\1', firstWord:'\2', localPart:'\4', company:'\5', email:'\3'}

See Demo