如何标记化、扫描或拆分这串电子邮件地址

How to tokenize, scan or split this string of email addresses

对于 Simple Java Mail,我正在尝试处理某种程度上自由格式的分隔电子邮件地址。请注意,我特别 不是 验证,只是从地址列表中获取地址。对于此用例,可以假定地址是有效的。

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

"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"和"Joe Sixpack ",可以出现在逗号/分号分隔的字符串中,忽略白色space填充。问题是名称可以包含定界符作为有效字符。

以下数组显示了所需的数据(尾随 space 或定界符不是大问题):

["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, "<|>")
  .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*[,;]", "<|>")
            .replaceAll("<\|>$", "")
            .split("\s*<\|>\s*");
}

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

    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)

使用 Java 的 replaceAll 和 split 函数(在下面的 javascript 中模仿),我会说锁定到你知道结束一个项目的内容(“.com”),替换分隔符具有独特的温度(uuid 或类似 <|> 的东西),然后使用重构的定界符进行拆分。

这是一个 javascript 示例,但是 Java 的 repalceAll 和 split 可以完成相同的工作。

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, "<|>").replace(/<\|>$/,"").split("<|>")
console.log(result)

此模式适用于您提供的示例:

([^@,;\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 Demo