2011-09-07 21 views
1

我需要驗證一個(四位)郵政編碼字段,可以接受的:正則表達式:需要驗證輸入爲單個,多個或一個範圍的郵政編碼

  1. 單個郵政編碼(例如4009) - >它具有通過逗號是四位
  2. 由逗號(多個)(例如4002,5001)
  3. 使用連字符甲郵政編碼的範圍(例如4000-4010)
  4. 任何#1組合和#3分離
  5. 多郵政編碼分離(例如4000,4002,4005-4010,5001)

的#4另一個例子是:4000-4007,5000

如何在C#中使用正則表達式我做驗證。我的問題更多的是關於如何構建模式本身。謝謝。

更新

這是我想出了(使用正則表達式上輸入你的):

public override bool IsValid(object value) 
{ 
    if (value == null) 
    { 
     return true; 
    } 

    var stringValue = value.ToString().Replace(" ", ""); 

    foreach (var pc in stringValue.Split(',')) 
    { 
     if(!Regex.Match(pc, @"^(\d{4})$|^(\d{4}-\d{4})$").Success) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

我是那種希望做驗證,而不必做string.Split( )。我不確定這是否可能。如果有人有更好的想法,請在這裏發佈。謝謝。

+0

如果這種採取4009-4000? – NullUserException

+0

如果正則表達式也可以檢測到這將是很好。理想情況下,它不應該花費4009-4000,即在該範圍內,第一個數字應該低於或等於第二個數字。 – user895852

回答

0

什麼^((\d{4})([,-])?)+$

編輯:這一個對80789809匹配藏漢

新:^(\d{4})(([,-])(\d{4}))*$

測試反對:

4000,4002,4005-4010,5001 yes 
4000-4007,5000 yes 
4000-4010 yes 
4002,5001 yes 
4009 yes 
40004002,4005-1010,5001 no 
4000-4007, 5000 no 
40004010 no 
4002,50no 
4009, no 
+0

優秀。我自己測試過它,它似乎涵蓋了所有可能性。謝謝本傑明。 – user895852

0

你需要的正則表達式是

^\d{4}(-\d{4})?(,\d{4}(-\d{4})?)*$ 

這是由逗號,其中每個範圍可以是單個郵政編碼或郵政代碼破折號郵政編碼分隔的一個或多個範圍。

如果你想效率,你會希望非捕獲組,如

^\d{4}(?:-\d{4})?(,\d{4}(?:-\d{4})?)*$ 
+0

我不想捕捉任何東西......我只需要驗證字符串遵循該模式。使用你的正則表達式,我試圖運行「4000,500d5」,它仍然返回true。 – user895852

+0

對不起。我編輯了答案以添加'^'和'$'錨點。讓我知道你是否需要一個更完整的例子。 –

0

這應該做的伎倆,並允許各個組件之間可選空白:

^\s*(\d{4}(\s*-\s*\d{4}))(\s*,\s*(\d{4}(\s*-\s*\d{4})))*\s*$ 
+0

我不知道如何把代碼放在這個評論框中......但無論如何,我嘗試了以下內容: 匹配匹配=正則表達式。Match(stringValue,@「^ \ s *(\ d {4}(\ s * - \ s * \ d {4}))(\ s *,\ s *(\ d {4} \ S * \ d {4})))* \ S * $「); 它返回false爲「4000,4005」 – user895852

相關問題