如何记号化,扫描或分裂的电子邮件地址此字符串(How to tokenize, scan or sp

2019-09-28 15:58发布

对于简单的Java邮件我试图处理分隔的电子邮件地址的有点自由格式。 请注意,我特别验证,刚开出地址的地址列表中。 对于这种使用情况可以假定这些地址是有效的。

这里是一个有效的输入的示例:

"name@domain.com,Sixpack, Joe 1 <name@domain.com>, Sixpack, Joe 2 <name@domain.com> ;Sixpack, Joe, 3<name@domain.com> , nameFoo@domain.com,nameBar@domain.com;nameBaz@domain.com;"

因此,有两种基本形式“name@domain.com”和“乔Sixpack”,它可以出现在逗号/分号分隔的字符串,忽略空白填充。 问题是,该名称可以包含分隔符为有效字符。

以下数组示出所需要的数据(尾部空格或定界符就不会成为一个大问题):

["name@domain.com",
"Sixpack, Joe 1 <name@domain.com>",
"Sixpack, Joe 2 <name@domain.com>",
"Sixpack, Joe, 3<name@domain.com>",
"nameFoo@domain.com",
"nameBar@domain.com",
"nameBaz@domain.com"]

我想不出一个干净的方式来解决这个问题。 任何建议我怎么能可靠地识别逗号是否是一个名称的一部分,或者是分隔符?


最终的解决方案(上公认的答案变化):

 var string = "name@domain.com,Sixpack, Joe 1 <name@domain.com>, Sixpack, Joe 2 <name@domain.com> ;Sixpack, Joe, 3<name@domain.com> , nameFoo@domain.com,nameBar@domain.com;nameBaz@domain.com;" // recognize value tails and replace the delimiters there, disambiguating delimiters const result = string .replace(/(@.*?>?)\s*[,;]/g, "$1<|>") .replace(/<\|>$/,"") // remove trailing delimiter .split(/\s*<\|>\s*/) // split on delimiter including surround space console.log(result) 

或在Java中:

public static String[] extractEmailAddresses(String emailAddressList) {
    return emailAddressList
            .replaceAll("(@.*?>?)\\s*[,;]", "$1<|>")
            .replaceAll("<\\|>$", "")
            .split("\\s*<\\|>\\s*");
}

Answer 1:

使用Java的的replaceAll和分割功能(在下面的JavaScript模仿),我会说锁到你知道结尾的项目(以下简称“.COM”),具有独特的温度(一个UUID或类似的东西替换分隔符<|>然后使用重构后的分隔符分割。

以下是JavaScript的例子,但Java的repalceAll和拆分可以做同样的工作。

 var string = "name@domain.com,Joe Sixpack <name@domain.com>, Sixpack, Joe <name@domain.com> ;Sixpack, Joe<name@domain.com> , name@domain.com,name@domain.com;name@domain.com;" const result = string.replace(/(\.com>?)[\s,;]+/g, "$1<|>").replace(/<\|>$/,"").split("<|>") console.log(result) 



Answer 2:

因为你没有验证,我假设的电子邮件地址是有效的。 基于这个假设,我将查找电子邮件地址,然后; 或者,这样我知道它有效。

  var string = "name@domain.com,Sixpack, Joe 1 <name@domain.com>, Sixpack, Joe 2 <name@domain.com> ;Sixpack, Joe, 3<name@domain.com> , nameFoo@domain.com,nameBar@domain.com;nameBaz@domain.com;" const result = string.match(/(.*?@.*?\..*?)[,;]/g) console.log(result) 



Answer 3:

这种模式适用于您所提供的例子:

([^@,;\s]+@[^@,;\s]+)|(?:$|\s*[,;])(?:\s*)(.*?)<([^@,;\s]+@[^@,;\s]+)>

([^@,;\s]+@[^@,;\s]+)   # email defined by an @ with connected chars except ',' ';' and white-space
|                       # OR
(?:$|\s*[,;])(?:\s*)    # start of line OR 0 or more spaces followed by a separator, then 0 or more white-space chars
(.*?)                   # name
<([^@,;\s]+@[^@,;\s]+)> # email enclosed by lt-gt

PCRE演示



文章来源: How to tokenize, scan or split this string of email addresses