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] == '@'最初は、あなたがちょうど見つけたので@!に初期化sするとi - 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

name(comment(comment))@fooこのソースはRFC822(またはRFC5322とRFC6531のはるかに新しい兄弟)であり、正規表現は合法であるのに電子メールを解析できないことがわかりますが、そうでname(comment))@fooはありません。

于 2012-12-04T20:27:51.760 に答える