对于简单的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*");
}