2012-12-04 80 views
0

如果可能的話,我想幫助一下這個電子郵件解析器。C++中的電子郵件解析器

此代碼有所有適當的聲明和初始化的,但我不知道我在哪裏搞亂了這個循環:

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; 
    } 

編輯:一個測試案例是在一個文本文件中的這個字符串「這是一個電子郵件文件與[email protected]和一些其他文本的測試」,我想這個「[email protected]」,我只得到這個「@ my.test和其他一些測試文本」

我哪裏錯了?

+1

我可以建議你嘗試改進一點縮進嗎?這很難閱讀,特別是因爲你在外部'for'循環中有這麼多的代碼。 –

+0

您能舉一些示例輸入和預期輸出嗎? –

+0

介紹一個[testcase](http://sscce.org),或者我們猜測(我不打算花費時間去做!)。 –

回答

1

你的問題就在這裏:

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

你檢查是否lines[s]是有效的,以決定是否終止;但最初是lines[s] == '@',因爲您剛剛找到了@!如果將s初始化爲i - 1,則會更接近......但您會發現substr中包含一堆off-by-ones。你最終需要做anEmail = lines.substr(s + 1, e + 1);

但是,這隻會導致代碼通過你的測試用例。這不是解析電子郵件地址的有效方法。此方法不適用於所有有效的電子郵件地址,包括"[email protected]"@foo"spaces are legal only in quotes"@foo。您還需要擴展validChar以處理實際的一組有效字符,這些字符因名稱和域而異; !#$%&'*+-/=?^_{}|[email protected][IPv6:2001:db8:1ff::a0b:dbd0]是完全合法的。最後,如果真的要排除非法地址是非常重要的,那麼您將再次受到這種方式的限制:[email protected]不合法,也不是[email protected]@foo

的來源,這是RFC822(或它的非常新的兄弟姐妹RFC5322和RFC6531),在那裏你會發現,一個正則表達式無法解析電子郵件,爲name(comment(comment))@foo是合法的,而name(comment))@foo不是。

+0

我已經閱讀了你以前的評論,並且在我解決了手頭的問題之後,我會編輯它。 (否則一長串問題永遠不會完成) – Archxiao