【问题标题】:Recognizing email fields without using regular expressions在不使用正则表达式的情况下识别电子邮件字段
【发布时间】:2013-09-18 08:07:05
【问题描述】:

我们有一个标记器来标记文本文件。遵循的逻辑很奇怪,但在我们的上下文中是必要的。

一封电子邮件,例如 xyz.zyx@gmail.com

将产生以下标记: xyz . zyx @ gmail

我想知道如果我们只允许使用这些令牌,我们如何将该字段识别为电子邮件。不允许使用正则表达式。我们只能使用令牌及其周围的令牌来确定该字段是否为电子邮件字段

【问题讨论】:

  • 为什么不用正则表达式?可以使用正则表达式在一行中完成。
  • @RafiKamal 因为标记器是一个独立的系统,它将向任何请求的应用程序提供标记流。 Tokenizer 是独立的,因此它不适合在此处添加用于电子邮件识别的正则表达式的结构
  • 仅仅从标记的序列你将无法区分“他说xyz。zyx@gmail.com是一个电子邮件地址。” “他说 zilch.xyz.zyx@gmail.com 是一个电子邮件地址。”通过一些启发式方法,您可能可以正确处理大多数情况,但您不可能 100% 正确地做到这一点。
  • 思考如何实现正则表达式。它可能还需要将字符串分成标记并检查标记字符串是否遵循给定的模式。所以,现在你得到了令牌,你需要实现模式部分。
  • . com 令牌呢?

标签: java parsing nlp


【解决方案1】:

好的..尝试一些像这样的(坏)逻辑......

  int i=0,j=0;
    if(str.contains(".") && str.contains("@"))
    {
     if((i=str.indexOf(".") < (j=str.indexOf("@")) 
    {
     if(i!=0 && i+1!=j)      //ignore Strings like .@ , abc.@ 
        return true;
    }
    }
    return false

【讨论】:

    【解决方案2】:

    在逻辑上将电子邮件地址分成 3 部分:

    1. 一个用户名(或资源名),为了这个解释,我们称之为用户名
    2. @ 字符。
    3. 主机名,由任意数量的“单词点”序列 + 最终顶级域字符串组成。

    像这样散步:

     while token can be part of a user name
        fetch next token;
        if there no more -> no e-mail;
    
    check if the next token is @
    if not -> no e-mail
    
    while there are tokens
        while token can be part of a host name subpart (the "word" above)
            fetch next token;
            if there are no more -> might be a valid e-mail address
    
        check if the next token is a dot
        if not -> might be a valid e-mail address
        set a flag that you found at least one dot
    
       check if the next token can be part of a host name subpart
           if not -> no valid e-mail address (or maybe you ignore a trailing dot and take what was found so far)
    

    如果需要更多令牌,请添加进一步检查。您可能还必须发布处理找到的令牌以确保有效的电子邮件地址,并且您可能必须倒带您的令牌生成器(或缓存获取的令牌)以防您没有找到有效的电子邮件地址并需要提供其他识别过程的相同输入。

    【讨论】:

      【解决方案3】:

      检查令牌列表是否为电子邮件:

      • 列表只包含一个标记@
      • 令牌索引@ != 0
      • @ 之后至少有 3 个标记
      • @ 后至少有 1 个 . 令牌,但不是紧随其后
      • 以字符标记开始和结束

      附加检查:

      • 没有两个. 后续令牌
      • 没有特殊字符
      • @ 之后的字符标记长度至少为 2
      • @ 之前所有字符标记的总长度至少为 3

      【讨论】:

        猜你喜欢
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 2021-06-14
        • 2011-12-28
        相关资源
        最近更新 更多