2012-03-13 8 views
2

私は、ユーザーに場所を尋ねるフォームフィールドを持つASP.NET/C#アプリケーションを用意しており、ジオコーディング目的でBing Mapsに渡します。私のクライアントは、これらの3つのフォーマットへの入力を制限したいいくつかの理由:市/州/郵便番号を検証するための正規表現

San Francisco, CA 91111 
San Francisco, CA 
91111 

しかし、私は、彼らはまた、同様にカナダの郵便番号のサポートを求めてしまうでしょうね。

もちろん、彼らはプロジェクトの立ち上げの2時間前に尋ねるので、私は正規表現を自分自身で調べて、それを理解するにはあまり時間がありません(私は正規表現ではひどいです)ここで尋ねる。

カナディアン郵便番号のサポート(ZIP + 4をサポートする必要はありません)と同様に、上記の3つのフォーマットのいずれかに合っていることを検証するために使用できるRegExを誰でも出すことができます。

+0

カナダの郵便番号の例を挙げることができますか? – GolfWolf

+0

wikipediaで見つかりました:カナダの書式は** A0A 0A0 **(A =任意の文字、0 =任意の数字) – GolfWolf

+0

A0A 0A0の形式です.Aは文字、0は数字です。時には2つのグループの間にスペースがあり、時にはそれを入力しない人もいます。 – Scott

答えて

10

が、私はこれを試してみましたが、それが思わ終了する仕事を待っていると私は

ホープ私の二pennyworthを置くだろうと思っていますあなたが指定したすべてのケースのための作業:

この正規表現を使用するときは、必ずどちらか作る
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

0

ない、それはこのための最良の正規表現ですが、しようとした場合を確認します。

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

EDITED:

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

カナディアン郵便番号と一致しない – Cfreak

+0

「91111」のようなデータの入力やカナダの郵便番号のサポートはサポートされていません。しかし、応答ありがとう。 – Scott

+0

このパターンも空白行に一致します – GolfWolf

1

カナダや米国の郵便番号を一致させるために、あなたは^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$を使用することができます。郵便番号が存在するときに都市と州を実際に必要としないので、正規表現が一致したときに入力の残りの部分を無視することができます。その正規表現をキャプチャグループに入れて抽出します。たとえば、次のC#はPCREを使用すると仮定すると

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

一致少なくとも一つのアルファ文字や都市のスペースとダッシュコンマが続く

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

、2つの文字状態コード可能、

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

スペースと5桁の数字または6文字のアルファベットg。

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

したがって、最初の例ではすべてを組み合わせます。 2番目の例では、3番目の例の最初の2.を組み合わせて、最後の部分の先頭にある\sを削除します。

EDIT:カナダの郵便番号にスペースがあることがあります。それをサポートするために追加されました。

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

OK。正規表現ではないので、問題をより小さな正規表現に分割して使用する傾向があります。

そのため、市と国が次のようになります。

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

米国の郵便番号は次のようになり

(\d{5}) 

カナダのZIPコードは次のようになります。

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

だから、ZIPコードは次のようになります。

((\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とcityの状態を検証します。数百万のアドレス検証のためにこれを本番環境で使用しているので、かなり安定しています。

((?:\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}|$)))$ 
関連する問題