2012-09-26 50 views
0

我有一些代碼讀取CSV文件的每一行,如果該值不匹配正確的值,它會將它添加到返回到用戶屏幕的錯誤列表。我遇到的問題是正則表達式本身。Regex行爲奇怪.net

protected void ReadData(string filePath, bool upload) 
{ 
    StringBuilder sb = new StringBuilder(); 
    #region upload 
    if (upload == true) // CSV file upload chosen 
    { 
     using (CsvReader csv = new CsvReader(new StreamReader(filePath), true)) // Cache CSV file to memory 
     { 
      int fieldCount = csv.FieldCount; // Total number of fields per row 
      string[] headers = csv.GetFieldHeaders(); // Correct CSV headers stored in array 
      SortedList<int, string> errorList = new SortedList<int, string>(); // This list will contain error values 
      bool errorFlag = false; 
      int errorCount = 0; 

      // Check if headers are correct first before reading data 
      if (headers[0] != "first name" || headers[1] != "last name" || headers[2] != "job title" || headers[3] != "email address" || headers[4] != "telephone number" || headers[5] != "company" || headers[6] != "research manager" || headers[7] != "user card number") 
      { 
       sb.Append("Headers are incorrect"); 
      } 

      else 
      { 
       while (csv.ReadNextRecord()) 
        try 
        { 
         //Check csv obj data for valid values 
         for (int i = 0; i < fieldCount; i++) 
         { 
          if (i == 0 || i == 1) // FirstName and LastName 
          { 
           if (Regex.IsMatch(csv[i].ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20 
           { 
            errorList.Add(errorCount, csv[i]); 
            errorCount += 1; 
            errorFlag = true; 
            string text = csv[i].ToString(); 
           } 
          } 

          else if (i == 5) // Company name 
          { 
           string text = csv[i]; 
           text.Replace("&", "and"); 
          } 
         } 

         if (errorFlag == true) 
         { 
          sb.Append("<b>" + "Number of Error: " + errorCount + "</b>"); 
          sb.Append("<ul>"); 
          foreach (KeyValuePair<int, string> key in errorList) 
          { 
           sb.Append("<li>" + key.Value + "</li>"); 
          } 
         } 
         else // All validation checks equaled to false. Create User 
         { 

          ORCLdap.CreateUserAccount(rootLDAPPath, svcUsername, svcPassword, csv[0], csv[1], csv[2], csv[3], csv[4], csv[5], csv[7]); 
          sb.Append("<b>New user data uploaded successfully</b>"); 
         } 

        }// end of try 

        catch (Exception ex) 
        { 
         sb.Append(ex.ToString()); 
        } 

        finally 
        { 
         lblMessage.Text = sb.ToString(); 
         sb.Remove(0, sb.Length); 

      } 
     } 
    } 
    #endregion 

的lblMessage.text包含這個網站:

當它應該是3個錯誤,因爲史密斯犯規包含一個數字。

有沒有人有這方面的建議?

+0

你能打破這種下降到你想匹配與正則表達式是什麼;你正在使用的正則表達式,以及你當前正在得到的結果 - 我認爲這裏的其他過程確實是混淆了其他簡單問題。 –

+0

當然。名字和姓氏可以包含字母,但不能包含數字。我== 0是fieldrow firstname和i == 1是fieldrow lastname。我認爲我的正則表達式字符串對於僅匹配字母的匹配值是正確的。基本上如果字符串中有數字添加到錯誤列表集合中。 –

回答

0

您需要字邊界添加到您的正則表達式,或啓動「^」和結束「$」 即 ^[a-zA-Z]+$

http://regexr.com?3298g

您當前的正則表達式是不正確的,將匹配任何含有字符串az或AZ,任何字母,任何位置。

http://regexr.com?3298j

+0

謝謝你完美的作品!我將正則表達式字符串更改爲您的建議,並將條件設置爲== false。例如如果正則表達式不匹配正確的值添加到錯誤列表。 –

+0

我會這樣做,當stackoverflow會讓我。你的實力對於這個網站來說太快了:D –

1

你也有一個邏輯錯誤:

if (Regex.IsMatch(csv[i].ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20 

應該

if (!Regex.IsMatch(csv[i].ToString(), "^[a-zA-Z]+$", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20 

,因爲它僅僅是一個錯誤,如果名下有其他角色比它[a-zA-Z],右?

(如果你使用RegexOptions.IgnoreCase你不需要[a-zA-Z][a-z]會做)

+0

我做了這個改變,但@DhruvPathak提出了第一個答案。不管怎麼說,還是要謝謝你。 –

+0

這就是爲什麼我寫了「也」; D沒有看到你已經注意到了邏輯錯誤。 – Mene

+0

是的,我知道,增加的A-Z是不必要的,因爲其他屬性,這就是爲什麼我感謝你指出這一點。 –