1

如果可能的话,我想要一些关于这个电子邮件解析器的帮助。

这段代码有所有正确的声明和初始化,但我不确定我在哪里搞砸了这个循环:

  while ( getline( fin, lines ) )
  {
     for ( int i = 0; i < lines.length( ); i++ )
     {
        if ( lines[ i ] == '@' )
        {
           for ( s = i; s < lines.length( ); s-- )
           {
              if ( s < 0 )
              {
                 break;
              }
              if ( validChar( lines[ s ] ) == false )
              {
                 break;
              }
           } //for

           for ( e = i; e > lines.length( ); e++ )
           {
              if ( e == lines.length( ) )
              {
                 break;
              }
              if ( validChar( lines[ e ] ) == false )
              {
                 break;
              }
              if ( lines[ e ] == '.' )
              {
                 hasDot = true;
              }
           } // for

           anEmail = lines.substr( s, e );

           cout << anEmail << endl;
        }
     } // if
  }    // while

这是为了功能:

  bool validChar( char a )
  {
     bool result = false;
     if ( a >= 'A' && a <= 'Z' || a >= 'a' && a <= 'z' || a >= '0' && a <= '9' || a == '.' || a == '-' || a == '+' )
     {
        result = true;
     }
     return result;
  }

编辑:一个测试用例是文本文件中的这个字符串“这是一个包含 DummyTest@my.test 和其他一些测试文本的电子邮件文件”,我想要这个“DummyTest@my.test”,我只是得到这个“@my.test 和其他一些测试文本”

我哪里错了?

4

1 回答 1

1

你的问题在这里:

       for ( s = i; s < lines.length( ); s-- )
       {
          //...
          if ( validChar( lines[ s ] ) == false )
          {
             break;
          }
       } //for

您正在检查是否lines[s]有效以决定是否终止;但lines[s] == '@'最初,因为你刚刚找到@!如果你初始化si - 1,你会更接近......但是你会发现你的substr里面有一堆不一样的。你最终需要做anEmail = lines.substr( s + 1, e + 1 );

但这只会导致代码通过您的测试用例。这不是解析电子邮件地址的有效方法。此方法不适用于所有有效的电子邮件地址,包括"an@sign"@foo"spaces are legal only in quotes"@foo。您还需要扩展 validChar 以处理实际的有效字符集,这些字符因名称和域而异;!#$%&'*+-/=?^_{}|~@[IPv6:2001:db8:1ff::a0b:dbd0]是完全合法的。最后,如果实际上排除非法地址对您很重要,您将再次受到这种方法的限制:double..dot@foo不合法,也不合法double@at@foo

其来源是 RFC822(或者它是较新的兄弟姐妹 RFC5322 和 RFC6531),在那里您会发现正则表达式无法解析电子邮件,这name(comment(comment))@foo是合法的,但name(comment))@foo不是。

于 2012-12-04T20:27:51.760 回答