2012-03-13 199 views
2

我有一個ASP.NET/C#應用程序,它具有一個表單字段,詢問用戶他們的位置,我們將其傳遞給Bing地圖進行地理編碼。出於某種原因,我的客戶希望限制輸入這三個格式:用於驗證城市/州/郵政編碼的正則表達式

San Francisco, CA 91111 
San Francisco, CA 
91111 

但是,我知道他們也將最終要求對於加拿大的郵政編碼的支持。

當然,他們要求在項目啓動前2小時,所以我沒有太多時間去研究正則表達式,並找出它(我在正則表達式中很糟糕),所以我想我' d問這裏。

任何人都可以出現RegEx,我可以用它來驗證它是否符合上述三種格式之一,同時支持加拿大郵政編碼(不必支持ZIP + 4)。

+0

您能舉一個加拿大郵政編碼的例子嗎? – GolfWolf 2012-03-13 14:50:55

+0

在維基百科上發現它:加拿大格式是** A0A 0A0 **(其中A =任何字母; 0 =任何數字) – GolfWolf 2012-03-13 14:52:27

+0

它們的格式爲A0A 0A0,其中A是字母,0是數字。有時候兩個羣體之間有空間,有時候人們不會進入。 – Scott 2012-03-13 14:52:34

回答

10

我嘗試這樣做,它似乎所有你所指定的情況下工作:

var pattern = 
    @" 
    (^[\w\s]+,\s\w{2}$)|      # City, State 
    (^[\w\s]+,\s\w{2}\s\d{5}$)|     # City, State and US PostCode 
    (^[\w\s]+,\s\w{2}\s(\w\d\w\s?\d\w\d)$)|  # City, State and Canada PostCode 
    (^\d{5}$)|         # US PostCode 
    (^\w\d\w\s?\d\w\d$)       # Canada PostCode"; 

當使用這種正則表達式,請確保您:

  • 指定RegexOptions.IgnorePatternWhitespace

  • 使用冷凝(不太可讀)版本: (^[\w\s]+,\s\w{2}$)|(^[\w\s]+,\s\w{2}\s\d{5}$)|(^[\w\s]+,\s\w{2}\s(\w\d\w\s?\d\w\d)$)|(^\d{5}$)|(^\w\d\w\s?\d\w\d$)
+1

根據此前的職位(https://stackoverflow.com/a/1146231/6009304)重新加蓋一個加拿大郵政編碼正則表達式,「加拿大郵政編碼不能包含字母D,F,I,O,Q或U,並且不能以W或Z開頭「。鏈接的文章中提供了正則表達式。 – Tyler 2017-10-18 16:57:36

0

不知道是否是這個最好的正則表達式,但嘗試:

([\D]+)? ([\D]+)?([\d]+)? 

編輯:

([\D]+)? ([\D]+)?([\d]+)?([\d\D]+){2} 
+0

與加拿大郵政編碼不匹配 – Cfreak 2012-03-13 14:54:32

+0

不支持輸入「91111」等數據,也不支持加拿大郵政編碼。儘管謝謝你的迴應。 – Scott 2012-03-13 14:56:01

+0

這種模式也匹配空行 – GolfWolf 2012-03-13 14:57:24

1

要匹配加拿大或美國的郵政編碼,就可以使用^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$。由於當郵政編碼存在時,您並不真的需要城市和州,您可以在正則表達式匹配時忽略其餘輸入。所以把這個正則表達式放在一個捕獲組中並提取它。例如:

Regex postalCodeRegex = new Regex("^.*(\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}).*$" 
      , RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant); 

Match m = postalCodeRegex.match(userInput); 
if(m.Success) 
{ 
    String postalCode = m.Groups[1].Value; 
    // Set location based on postal code 
} 
else 
{ 
    // Set location based on city 
} 
2

假設C#使用PCRE:

匹配至少一個字母字符和允許空間和破折號爲城市

[A-Za-z\s\-]+ 

其次逗號,兩個字符的狀態代碼,

,\s?[A-Za-z]{2} 

後跟一個空格和一個5位數字或一個6字符的alpha字符串G。

\s(\d{5}|[A-Za-z0-9]{3}\s?[A-Za-z0-9]{3}) 

因此,第一個例子結合了一切。對於第二個示例,結合第一個2.對於第三個示例,刪除最後一部分的前導\s

編輯:發現有時在加拿大郵政編碼有一個空間。添加到支持。

0

我不確定你所要求的確切規格的,但你可以使用像這樣的表達在你的例子匹配的格式字符串:

var re = @"(?xi)^\s* 
    (?: 
     [a-z][^,]+ , \s+ [a-z]{2} 
     (?: \s+ \d{5})?   # optional postal code 
    | 
     \d{5}      # postal code 
    | 
     [a-z]\d[a-z]\s*\d[a-z]\d # canadian code 
    ) 
    \s*$"; 
0

確定。不是一個正則表達式,我傾向於將問題分解成更小的正則表達式,然後使用它們。

因此,城市和國家將是:

([a-zA-Z ]+, [a-zA-z ]+) 

美國郵編是

(\d{5}) 

加拿大的郵政編碼是:

([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d) 

因此,郵政編碼爲:

((\d{5})|([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d)) 

乾脆把它們給了我們:

(([a-zA-Z ]+, [a-zA-z]+) ((\d{5})|([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d))?|((\d{5})|([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d)))

(市,州後跟一個可選的ZIP,或本身就是一個ZIP)

我敢肯定,有更簡單的方法字母,但我在等待一個作業完成,我想我會把我的兩便士的

希望這有助於

0

這已經花了很多工作,但是這將驗證大多數版本的城市狀態zip和城市狀態。我們在生產中使用它來驗證數百萬個地址,所以它非常穩定。

((?:\w|\s|\w\.)+),?\s(?i:AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|Alabama|Alaska|Arizona|Arkansas|California|Colorado|Connecticut|Delaware|District of Columbia|Florida|Georgia|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland|Massachusetts|Michigan|Minnesota|Mississippi|Missouri|Montana|Nebraska|Nevada|New Hampshire|New Jersey|New Mexico|New York|North Carolina|North Dakota|Ohio|Oklahoma|Oregon|Pennsylvania|Rhode Island|South Carolina|South Dakota|Tennessee|Texas|Utah|Vermont|Virginia|Washington|West Virginia|Wisconsin|Wyoming)(|.(\d{5}(-\d{4}|\d{4}|$)))$ 
相關問題