2013-04-21 65 views
1

我想檢查一個字符串是否屬於ABC123類型。C#檢查字符串是否屬於ABC123

  • 字符串的長度必須是6
  • 只有字母和數字是允許的。
  • 字符串的前三個值必須是字母。

這就是我所做的。我如何改進代碼?

private void ValidationOfFlightCode(string flightCode) 
    { 
     if (flightCode.Length == 6) 
     { 
      bool state = Regex.IsMatch(flightCode, @"^[a-zA-Z0-9]+$"); 
      if (state) 
      { 
       bool isLetter = false; 
       for (int i = 0; i < 3; i++) 
       { 
        isLetter = Char.IsLetter(flightCode, i); 
        if (!isLetter) 
         break; 
       } 
       if (isLetter) 
       { 
        MessageBox.Show(flightCode + ": " + state); 
       } 
       else 
       { 
        MessageBox.Show("The letters must be before the numbers"); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Only letters and numbers are allowed!"); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Flight Code must be 6 characters long"); 
     } 
    } 
+1

你是否需要針對每個錯誤的特定錯誤消息?否則,這個正則表達式將完成這項工作:'[A-Z] {3} [A-Z0-9] {3}'。 – alexn 2013-04-21 13:35:56

回答

5

這個正則表達式應該工作:

^[a-zA-Z]{3}[a-zA-Z0-9]{3}$ 
//^ ^ ^ ^
// |  |  |  | 
// |  |  |  +-- Three times 
// |  |  +--------- Letters or digits 
// |  +---------------- Three times 
// +---------------------- Only letters 

如果IsMatch在這個表達式返回false,你可以做進一步的驗證,看看有什麼是錯的。

我該如何改進代碼?

您可以創建一組正則表達式和錯誤消息。每個正則表達式應該比前一個更具限制性。瀏覽列表,並嘗試將代碼與正則表達式進行匹配。如果有沒有匹配,則打印錯誤消息並退出循環。例如,你可以這樣做:

  • ^.{6}$ - 「的代碼必須包含六個字符」
  • '^ [A-ZA-Z0-9] {6} $' - 「字符必須是alhpanumeric 「
  • '^ [A-ZA-Z] {3} {3} $。' - 」前三個字符必須是字母「
+0

如果我只想要最後三個字符中的數字,那麼正則表達式是什麼? – EM10 2013-04-21 13:44:38

+2

^[a-zA-Z] {3} [0-9] {3} $ – 2013-04-21 13:46:34

0

在長度檢查之前,您還可以執行空檢查,具體取決於此函數如何獲取其輸入。

在附註上,我個人發現Messages框令人討厭。它可能會更好有一些標籤旁邊的文本框,而不是顯示錯誤。

0

我明白,你也想保持一個可能性給用戶一個關於錯誤的反饋? 我個人可能會在一個正則表達式中測試所有這些條件,就像上面發佈的那樣。然後,如果它失敗了,我會測試其他表達式的數量來獲得失敗的原因。我比正則表達式更信任一些測試迭代。

1

如果您不需要對發生什麼錯誤有如此具體的描述,那麼您可以編寫一個能夠一次捕獲整個規範的正則表達式。我假設表單總是AAAXXX,即三個字母和三位數字(最後三個字符中絕不會有一個字母),但如果字母在那裏也很容易適應。

bool isOK = Regex.IsMatch(flightCode, @"^[a-zA-Z]{3}[0-9]{3}$"); 

該正則表達式還強加字符的排序和字符串的總長度。不過,我會再進一步​​,這樣做,因爲在string類型的擴展方法:

public static class FlightCodeValidationExtensions { 
    public static bool IsValidFlightCode(this string str) { 
     return Regex.IsMatch(flightCode, @"^[a-zA-Z]{3}[0-9]{3}$"); 
    } 
} 

現在,你可以通過簡單地調用str.IsValidFlightCode()驗證字符串作爲flightcode,只要你已經導入了命名空間其中,上述類位於(有幾個附加組件到Visual Studio將自動爲您做到這一點。

0
  • 怎麼樣二號3個字符?你沒有測試這些
  • 1日3必須「美國信件」?不能是任何其他語言環境?(如「é」,或中文/日文/希伯來文/等)

用於改進: *您可以跳過正則表達式,因爲無論如何您都會執行char.IsLetter。你也可以爲第二個3個字符添加char.IsLetterOrDigit(或者char.IsDigit,如果這3個字符必須是數字的話) *也可以刪除'else'分支,並在你的for失敗時拋出一個錯誤信息,並給出所需的格式一般來說(「飛行代碼必須是6個字符長,3個數字& 3個數字,如ABC123」)。這樣可以加快一點,你只會測試值一次(IF-THEN-ELSE)

0

使用下面的代碼只有一個字符串的最後三個字符匹配:

bool isMatch = Regex.IsMatch("flightCode", @"[a-zA-Z0-9]{3}$");