代码之家  ›  专栏  ›  技术社区  ›  Benny Bottema

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

  •  1
  • Benny Bottema  · 技术社区  · 9 年前

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

    以下数组显示了所需的数据(尾随空格或分隔符不会是大问题):

    ["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*");
    }
    
    3 回复  |  直到 9 年前
        1
  •  2
  •   Bamieh    9 年前

    由于您没有验证,我假设电子邮件地址是有效的。 ; ,

        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)
        2
  •  2
  •   linden2015    9 年前

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

        3
  •  1
  •   Tezra    9 年前

    使用Java的replaceAll和split函数(在下面的javascript中进行了模拟),我会说锁定到一个项目(即“.com”)的末尾,用一个唯一的temp(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, "$1<|>").replace(/<\|>$/,"").split("<|>")
    console.log(result)