对于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*");
}
答案 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
答案 2 :(得分:1)
使用Java的replaceAll和split函数(在下面的javascript中模仿),我会说锁定你知道的结束项目(&#34; .com&#34;),用一个唯一的替换分隔符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)
&#13;