如何对此字符串的电子邮件地址进行标记,扫描或拆分

时间:2017-08-22 19:22:14

标签: java regex tokenize

对于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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

使用Java的replaceAll和split函数(在下面的javascript中模仿),我会说锁定你知道的结束项目(&#34; .com&#34;),用一个唯一的替换分隔符temp(一个uuid或像<|>之类的东西),然后使用重构的分隔符进行拆分。

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

&#13;
&#13;
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)
&#13;
&#13;
&#13;