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

标签 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*");
}

最佳答案

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

    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 - 如何标记化、扫描或拆分这串电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825426/

相关文章:

java - 如何使用 Java 发送 HTTP GET 并使用用 C++ 编写的 CGI 应用程序打印 QUERY_STRING 环境变量?

regex - app.yaml skip_files 跳过整个目录,但跳过一个单独的文件

java - 我需要将 java 代码的字符串标记为其 block

java - 使用 Apache Commons compress 解压 Tar 文件时发生异常

java - 如果发生超时异常,重新订阅可观察对象

java - 如何为类路径设置参数

javascript - 搜索逗号并删除 if orphan

mysql - 选择电话字段中包含文本的所有记录

Android 和 CommaTokenizer

c - 是否有 sscanf 的变体,它带有指向输入字符串而不是缓冲区的指针?