英国の郵便番号を照合するためのRegEx


186

私は、入力文字列内でのみ完全な複雑なUK郵便番号を検証する正規表現を求めています。珍しいすべての郵便番号フォームは、通常と同様にカバーする必要があります。例えば:

一致する

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

歯が立たない

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

この問題を解決するにはどうすればよいですか?


2
役に立たないように見える@axrwkr
Kieran Benton

8
英国の郵便番号の検証-JavaScriptおよびPHP有効な郵便番号と一致する承認された回答を取得できませんでしたが、これを見つけました。有効な郵便番号と一致します。クライアント側の検証では、JavaScriptバージョンをそのまま使用できます。サーバー側の検証では、JavaScriptをC#として書き換えることはかなり簡単です。郵便番号を再フォーマットしてスペースを含めることもできるため、郵便番号をW1A1AAとして入力すると、検証に加えて、郵便番号がW1A 1AAに再フォーマットされます。英国のさまざまな地域の珍しい郵便番号も扱います。

2
提供されたリンクは、「AA1A 1AA」形式では機能しません。参考:dhl.com.tw/content/dam/downloads/tw/express/forms/...
アンソニー・スカイフ

1
あなたは、単に郵便番号を確認したい場合は、私たちは自由を提供し、検証REST APIエンドポイント(必要なサインアップ) - developers.alliescomputing.com/postcoder-web-api/address-lookup/...
スティーブンKeable

1
良い質問。一致する必要がある珍しい例のリストに、「M1 3HZ」などのマンチェスター中心部の郵便番号を含めることは価値があると思います。多くの人は、1文字1数字のコンボに気づいていません。
マーティンジョイナー2017

回答:


208

郵便番号については、英国政府のデータ標準をご覧になることをお勧めします[リンクは終了しました。XMLのアーカイブ、議論についてはWikipediaを参照してください]。データについての簡単な説明があり、添付のxmlスキーマは正規表現を提供します。それはあなたが望むものではないかもしれませんが、良い出発点になるでしょう。RegExはXMLとは少し異なります。A9A9AA形式の3番目の位置にあるP文字は、指定された定義で許可されているためです。

英国政府から提供されたRegExは次のとおりです。

([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\s?[0-9][A-Za-z]{2})

Wikipediaのディスカッションで指摘されているように、これにより一部の非実際の郵便番号(AA、ZYで始まる郵便番号など)が許可され、試行できるより厳密なテストが提供されます。


52
そして、2つのセグメントの間にオプションの空白を含む正規表現(GIR 0AA)|((([[AZ- [QVX]] [0-9] [0-9]?)|(([AZ- [QVX]] [AZ- [IJZ]] [0-9] [0-9]?)|(([AZ- [QVX]] [0-9] [A-HJKSTUW])|([AZ- [QVX]] [ AZ- [IJZ]] [0-9] [ABEHMNPRVWXY])))))\ s?[0-9] [AZ- [CIKMOV]] {2})
gb2d

7
毎年ページが期限切れになるように見えるので、実際の正規表現を答えに持ってくるのは良い考えかもしれません...
pauloya '21

7
この正規表現はXMLスキーマ用であることに注意してください。これは明らかに、他の正規表現フレーバーとは少し異なります
artbristol 2013

6
これをJavaScriptで動作させることはできません。特定の正規表現エンジンでのみ機能しますか?
NickG 2014年

12
実際、彼らはそれを変更しました:バルクデータ転送^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$
wieczorek1990

85

それは私たちが使用しているつもりのように見える^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$上記Minglisで推薦しているの少し変更したバージョンがあります、。

ただし、上記のさまざまなソリューションでは、どの文字が許可されるかについて異なるルールが適用されているように見えるため、ルールについて正確に調査する必要があります。

調査の結果、さらに詳しい情報が見つかりました。どうやら 'govtalk.gov.uk'のページは、郵便番号の仕様govtalk-postcodesを示しています。これは、郵便番号規則の「疑似正規表現」ステートメントを提供するXMLスキーマの XMLスキーマを指します。

私たちはそれを取り入れて、次の表現を与えるために少し作業しました:

^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$

これにより、スペースはオプションになりますが、スペースは1つに制限されます(スペースを無制限にするには、「&」を「{0、}」に置き換えます)。すべてのテキストは大文字でなければならないことを前提としています。

スペースを含めて小文字を許可する場合は、次のようにします。

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

これは海外の地域を対象としておらず、フォーマットの適用のみを行っており、異なる地域の存在は対象としていません。次のルールに基づいています。

次のフォーマットを受け入れることができます:

  • 「GIR 0AA」
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

どこ:

  • 9は任意の1桁の数字です。
  • Aは、Q、V、またはX以外の任意の文字です。
  • Bは、I、J、またはZ以外の任意の文字です。
  • Cは、I、L、M、N、O、P、Q、R、V、X、Y、またはZ以外の任意の文字です。
  • Dは、I、J、またはZを除く任意の文字です。
  • Eは、A、B、E、H、M、N、P、R、V、W、X、Yのいずれでもかまいません。
  • Zは、C、I、K、M、O、またはV以外の任意の文字です。

ご多幸を祈る

コリン


2
すばらしい答えです。海外の質問にも追加しました^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$
David Bradshaw

無制限のオプションのスペース{0,}*はなく、なぜ指定するのですか?
アニマルのコード

76

最近、R言語の英国の郵便番号この質問の回答を投稿しまし。私がいることを発見し、英国政府の正規表現パターンが誤っているとして失敗し、適切にいくつかの郵便番号を検証します。残念ながら、ここでの回答の多くは、この誤ったパターンに基づいています。

以下にこれらの問題のいくつかを概説し、修正された正規表現を提供します 実際に機能ます。


注意

私の答え(および一般的な正規表現):

  • 郵便番号のみを検証します 形式ます
  • 郵便番号が 正当に存在する
    • これには、適切なAPIを使用してください!詳細については、ベンの回答を参照してください。

不正な正規表現を気にせず、回答にスキップしたい場合は、[ 回答]セクションまでスクロールします。

悪い正規表現

このセクションの正規表現は使用しないでください。

これは、英国政府が開発者に提供した失敗した正規表現です(このリンクが有効になるまでの時間はわかりませんが、バルクデータ転送のドキュメントで確認できます)。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

問題

問題1-コピー/貼り付け

ここで使用中の正規表現を参照してください

多くの開発者がそうしているように、コード(特に正規表現)をコピーして貼り付け、機能することを期待して貼り付けます。これは理論的には優れていますが、このドキュメントからコピー/貼り付けすると、実際に次のように文字の1つ(スペース)が改行文字に変更されるため、失敗します。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))
[0-9][A-Za-z]{2})$

ほとんどの開発者が最初に行うことは、何も考えずに改行を消去することです。正規表現は、郵便番号とスペースを含む郵便番号(GIR 0AA郵便番号以外)を照合しなくなります。

この問題を修正するには、改行文字をスペース文字に置き換える必要があります。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                                     ^

問題2-境界

ここで使用中の正規表現を参照してください

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
^^                     ^ ^                                                                                                                                            ^^

郵便番号の正規表現が不適切に正規表現をアンカーしています。このような正規表現を使用して郵便番号を検証する人は、などの値fooA11 1AAが通過した場合に驚くかもしれません。これは、上記の正規表現で指摘したように、最初のオプションの開始と2番目のオプションの終了を(互いに独立して)固定しているためです。

つまり、^(行の先頭に位置をアサートする)は最初のオプション([Gg][Ii][Rr] 0[Aa]{2})でのみ機能するため、2番目のオプションは終了するすべての文字列を検証します郵便番号(以前のものに関係なく)。

同様に、最初のオプションは、行の末尾に固定されていない$ので、GIR 0AAfooまた受け入れられます。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

この問題を修正するには、両方のオプションを別のグループ(または非キャプチャグループ)にラップし、その周りにアンカーを配置する必要があります。

^(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$
^^                                                                                                                                                                      ^^

問題3-不適切な文字セット

ここで使用中の正規表現を参照してください

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                       ^^

正規表現には-、文字の範囲を示すためのhere がありません。現状では、郵便番号がANA NAAA文字をN表し、数字を表す)形式であり、Aまたは以外で始まる場合Z、失敗します。

つまり、A1A 1AAand と一致しますがZ1A 1AA、一致しませんB1A 1AA

この問題を解決するには、文字が-間に配置する必要がありますAし、Zそれぞれの文字セットで:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                        ^

問題4-間違ったオプションの文字セット

ここで使用中の正規表現を参照してください

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                        ^

私は彼らがこのことをウェブで公表する前にテストさえしなかったことを誓います。彼らは間違った文字セットをオプションにしました。彼ら[0-9]はオプション2の4番目のサブオプション(グループ9)でオプションを作成しました。これにより、正規表現はのように誤ってフォーマットされた郵便番号に一致することができますAAA 1AA

この問題を修正するには、代わりに次の文字クラスをオプションにします(その後、セットを[0-9]1回だけ一致させます)。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?)))) [0-9][A-Za-z]{2})$
                                                                                                                                                ^

問題5-パフォーマンス

この正規表現のパフォーマンスは非常に貧弱です。まず最初に、一致する可能性が最も低いパターンオプションをGIR 0AA最初に配置しました。他のどの郵便番号に対してこの郵便番号を持っている可能性が高いユーザーの数。おそらく決して?これは、正規表現が使用されるたびに、次のオプションに進む前に、まずこのオプションを使い果たす必要があることを意味します。パフォーマンスへの影響を確認するには、元の正規表現が実行したステップ数(35)を、オプションを反転した後同じ正規表現(22)と比較してください。

パフォーマンスに関する2番目の問題は、全体の正規表現が構造化されているためです。失敗した場合、各オプションをバックトラックする意味はありません。現在の正規表現の構造を大幅に簡略化できます。回答セクションでこれに対する修正を提供します。

問題6-スペース

ここで使用中の正規表現を参照してください

これ自体は問題とは見なされない可能性がありますが、ほとんどの開発者にとって懸念事項となります。正規表現のスペースはオプションではありません。つまり、郵便番号を入力するユーザーは郵便番号にスペースを入れる必要があります。これは、?スペースの後に追加するだけで簡単に修正でき、オプションにできます。修正については、回答セクションを参照してください。


回答

1.英国政府の正規表現の修正

問題」セクションで概説されているすべての問題を修正し、パターンを単純化すると、次の短くて簡潔なパターンが得られます。また、郵便番号全体(個々の部分ではない)を検証しているため、ほとんどのグループを削除することもできます。

ここで使用中の正規表現を参照してください

^([A-Za-z][A-Ha-hJ-Yj-y]?[0-9][A-Za-z0-9]? ?[0-9][A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$

これは、いずれかのケース(大文字または小文字)からすべての範囲を削除し、大文字と小文字を区別しないフラグを使用することにより、さらに短縮できます。:一部の言語にはないので、上記の長い方を使用します。各言語では、大文字と小文字を区別しないフラグの実装が異なります。

ここで使用中の正規表現を参照してください

^([A-Z][A-HJ-Y]?[0-9][A-Z0-9]? ?[0-9][A-Z]{2}|GIR ?0A{2})$

(正規表現エンジンがサポートしている場合)に置き換え[0-9]てもう一度短くして\dください:

ここで使用中の正規表現を参照してください

^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

2.簡略化されたパターン

特定のアルファベット文字を確認せずに、以下を使用できます(1の簡略化を覚えておいてください。ここでは、英国政府の正規表現の修正も適用されています)。

ここで使用中の正規表現を参照してください

^([A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

さらに、特別なケースを気にしない場合は、次のようになりますGIR 0AA

^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$

3.複雑なパターン

新しい地域、地区、準地区はいつでも表示される可能性があるため、郵便番号の過剰確認はお勧めしません。私が提案する可能性があることは、エッジケースのサポートの追加です。いくつかの特殊なケースが存在し、このWikipediaの記事で概説されています

以下は、3(3.1、3.2、3.3)のサブセクションを含む複雑な正規表現です。

1.イギリス政府の正規表現の修正のパターンに関連して:

ここで使用中の正規表現を参照してください

^(([A-Z][A-HJ-Y]?\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

そして2.に関連して。単純化されたパターン

ここで使用中の正規表現を参照してください

^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

3.1イギリスの海外領土

ウィキペディアの記事には現在、次のように記載されています(一部の形式は若干簡略化されています):

  • AI-1111:アンギラ
  • ASCN 1ZZ:アセンション島
  • STHL 1ZZ:セントヘレナ
  • TDCU 1ZZ:トリスタンダクーニャ
  • BBND 1ZZ:イギリス領インド洋地域
  • BIQQ 1ZZ:英国南極地域
  • FIQQ 1ZZ: フォークランド諸島
  • GX11 1ZZ:ジブラルタル
  • PCRN 1ZZ:ピトケアン諸島
  • SIQQ 1ZZ:サウスジョージアとサウスサンドイッチ諸島
  • TKCA 1ZZ:タークスカイコス諸島
  • BFPO 11:アクロティリとデケリア
  • ZZ 11GE CX:バミューダ(このドキュメントによると)
  • KY1-1111:ケイマン諸島(このドキュメントによると)
  • VG1111:英領バージン諸島(このドキュメントによると)
  • MSR 1111:モントセラト(このドキュメントによると)

英国の海外領土のみに一致するすべてを含む正規表現は次のようになります。

ここで使用中の正規表現を参照してください

^((ASCN|STHL|TDCU|BBND|[BFS]IQQ|GX\d{2}|PCRN|TKCA) ?\d[A-Z]{2}|(KY\d|MSR|VG|AI)[ -]?\d{4}|(BFPO|[A-Z]{2}) ?\d{2}|GE ?CX)$

3.2イギリス軍郵便局

最近、英国の郵便番号システムに合わせてBF##数字はを表す)に変更されましたが、オプションの代替郵便番号と見なされます。これらの郵便番号はの形式BFPOに従い、その後に1〜4桁が続きます。

ここで使用中の正規表現を参照してください

^BFPO ?\d{1,4}$

3.3サンタ?

サンタには別の特別なケースがあります(他の回答で述べたように):SAN TA1有効な郵便番号です。これの正規表現は非常に単純です:

^SAN ?TA1$

4
単純化されたパターンは、使用する本当に良いオプションです。正規表現では制限が厳しすぎないようにしてください。変更を加えて更新する必要があります。そうしないと、ユーザーが非常に怒る可能性があります。単純化された正規表現と緩やかに一致させて明らかなエラーを取り除き、アドレス検索(またはメールの正規表現の場合は確認メール)などの追加のチェックを適用して有効性を確認する方が良いと思います。
James Coyle

2
優れた徹底した分析。
スティーブ

1
非常に多くのレベルで素晴らしい答え。結局、私はあなたの2番目の単純化されたパターンで行きました。私は実際にすべての英国の郵便番号が入ったDBを持っているので、アドレス文字列に有効な郵便番号が含まれているかどうかを確認するために最初のパスが必要なだけなので、誤検出については気にしません(実際の検索ではそれらが根絶されるため)。 、しかし私は偽陰性を気にします。そしてスピードも重要です。
John Powell

英国の郵便番号システムには非常に多くの問題があり、コンピューター時代の前に委員会によって明らかに作成されましたが、可変長とスペースの問題は最も悪質なものの1つです。E1 5JXからE1 5JXのような郵便番号のパディングを含め、あらゆる種類の恐怖を見てきました。つまり、3つのスペースがあるため、ExcelのSW18 5HAとうまく一致します(住所を管理するために明らかに不適切なソフトウェアを挿入します)。唯一まともな解決策、私見は、それがどこかなど弾性、Solrの、Postgresの、近づく前に郵便番号が単一の文字列であるように、すべてのスペースを取り除くことです
ジョン・パウエル

45

郵便番号を検証できる包括的な英国の郵便番号正規表現などはありません。正規表現を使用して、郵便番号が正しい形式であることを確認できます。それが実際に存在するということではありません。

郵便番号は任意に複雑で、常に変化します。たとえば、アウトW1コードには、すべての郵便番号領域に対して、1から99までの数はありません。

あなたは現在そこにあるものが永遠に真実であると期待することはできません。例として、1990年に、郵便局はアバディーンが少し混雑していると決定しました。彼らはAB1-5の最後に0を追加してAB10-50にし、これらの間にいくつかの郵便番号を作成しました。

新しい道路が建設されるたびに、新しい郵便番号が作成されます。これは、ビルドの許可を取得するプロセスの一部です。地方自治体は、郵便局でこれを最新の状態に保つ義務があります(すべての人がそうするわけではありません)。

さらに、他の多くのユーザーが指摘しているように、Girobank、GIR 0AA、Santa TA1への手紙用の特別な郵便番号があります-おそらくそこには何も投稿したくないが、表示されないようです。他の答えによってカバーされます。

次に、BFPO郵便番号があり、より標準的な形式に変更されています。どちらの形式も有効になります。最後に、海外領土のソースWikipediaがあります。

+ ---------- + -------------------------------------- -------- +
| 郵便番号| ロケーション|
+ ---------- + -------------------------------------- -------- +
| AI-2640 | アンギラ|
| ASCN 1ZZ | アセンション島|
| STHL 1ZZ | セントヘレナ島|
| TDCU 1ZZ | トリスタンダクーニャ|
| BBND 1ZZ | イギリス領インド洋地域|
| BIQQ 1ZZ | イギリス南極地域|
| FIQQ 1ZZ | フォークランド諸島|
| GX11 1AA | ジブラルタル|
| PCRN 1ZZ | ピトケアン諸島|
| SIQQ 1ZZ | サウスジョージアとサウスサンドイッチ諸島|
| TKCA 1ZZ | タークスカイコス諸島|
+ ---------- + -------------------------------------- -------- +

次に、英国が郵便番号システムを世界中の多くの場所に「輸出」したことを考慮する必要があります。「英国」の郵便番号を検証するものはすべて、他の多くの国の郵便番号も検証します。

英国の郵便番号を検証したい場合、最も安全な方法は、現在の郵便番号のルックアップを使用することです。いくつかのオプションがあります:

  • Ordnance Surveyは、オープンデータライセンスでCode-Point Openをリリースしました。時代遅れになりますが無料です。Ordnance Surveyには権限がないため、これには(おそらく-思い出せません)北アイルランドのデータは含まれません。北アイルランドでのマッピングは、北アイルランドの兵器調査によって実施されており、それらには、個別の有償のポインター製品があります。これを使用して、簡単にカバーされないいくつかを追加することができます。

  • Royal MailがPostcode Address File(PAF)をリリースしました。これには、Code-Point Openが実行するかどうか不明なBFPOが含まれます。それは定期的に更新されますが、費用がかかります(そして、それは時にはそれについて実に意味があるかもしれません)PAFには、郵便番号だけでなく完全な住所が含まれ、独自のプログラマガイドが付属しています。Open Data User Group(ODUG)は現在、PAFを無料でリリースするよう働きかけています。ここに、その立場を説明します。

  • 最後に、AddressBaseがあります。これは、Ordnance Survey、Local Authorities、Royal Mail、およびマッチング会社とのコラボレーションであり、すべての英国の住所に関するすべての情報の決定的なディレクトリを作成します(かなり成功しています)。有償ですが、地方自治体、政府部門、または政府機関と協力している場合は、無料で利用できます。郵便番号が含まれているだけでなく、より多くの情報があります。


見た目が面白い
SuperUberDuper 2015年

2
これはオペレーションが求めていた答えではありませんが、おそらく最も有用です。これにより、これから行うチェックルールを緩和することができます。
John Hunt

22

私は上記の回答の一部に見ていたと私はダンさん@からパターンを使用しないことをお勧めしたいの答え(C。12月15日'10)他の人がいない間、無効として、それが誤ったフラグの有効な郵便番号のほぼ0.4%をするので、 。

Ordnance Surveyは、Code Point Openと呼ばれるサービスを提供します。

イギリスの現在のすべての郵便番号単位のリストが含まれています

上記の正規表現のそれぞれを、このデータからの郵便番号の完全なリスト(2013年7月6日)に対して実行しましたgrep

cat CSV/*.csv |
    # Strip leading quotes
    sed -e 's/^"//g' |
    # Strip trailing quote and everything after it
    sed -e 's/".*//g' |
    # Strip any spaces
    sed -E -e 's/ +//g' |
    # Find any lines that do not match the expression
    grep --invert-match --perl-regexp "$pattern"

合計1,686,202の郵便番号があります。

以下は、 それぞれに一致しない有効な郵便番号の数です$pattern

'^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$'
# => 6016 (0.36%)
'^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$'
# => 0
'^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$'
# => 0

もちろん、これらの結果は、誤って無効としてフラグが付けられた有効な郵便番号のみを扱います。そう:

'^.*$'
# => 0

無効な郵便番号のフィルタリングに関して、どのパターンが最適であるかについては何も言っていません。


1
これは私の答えで私が言っていることではありません。あなたが反証ルートをたどるなら、おそらくすべてを行い、誰かが答えを変更した場合はそれを更新し続けるべきでしょうか?そうでない場合は、少なくとも回答を最後に編集した日付を参照して、回答が変更されたかどうかを人々に確認してもらいます。
Ben

フェアポイント。それに応じて編集。これらのパターンのほとんどはCPOコードを除外しないが、最も支持された(有効な正規表現)回答は除外することを指摘することは、議論に追加されると思います。今後の読者:私の結果は古くなる可能性があることに注意してください。
RichardTowers 2013

17
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

有効な英国の郵便番号に一致する正規表現。英国の郵便システムでは、すべての文字がすべての位置で使用されるわけではなく(車両登録プレートと同じ)、これを管理するためのさまざまなルールがあります。この正規表現は、それらのルールを考慮に入れています。ルールの詳細:郵便番号の前半有効な形式[AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [0-9] [0-9] [AZ] [0-9] [ 0-9] [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [AZ] [0-9] [AZ] [AZ] [0-9]例外の位置-最初。制約-QVXは使用されていません。位置-2番目。制約-IJZはGIR 0AA位置以外では使用されません-3番目。制約-AEHMNPRTVXYは位置-フォースのみを使用しました。制約-ABEHMNPRVWXY郵便番号の後半有効な形式[0-9] [AZ] [AZ]例外位置-2番目と3番目。制約-CIKMOVは使用されません

http://regexlib.com/REDetails.aspx?regexp_id=260


1
それは正しい正規表現だ-人々はこの答えをdownvotedした理由は考えていない
Ollie第

正規表現は、Javscriptの郵便番号「YO31」および「YO31 1」では機能しません。
Pratik Khadloya

9
与えられた正規表現は説明と矛盾し0-9、で始まる郵便番号を使用できることを示唆しているため、これは正しいとは思わない
Luigi Plinge

4
この正規表現は約6000の有効な郵便番号で失敗するので、これはお勧めしません。私の答えをください。
RichardTowers 2013

これは、小文字の郵便番号またはスペースなしで失敗します
Dancer

14

このウィキペディアの表によると

ここに画像の説明を入力してください

このパターンはすべてのケースをカバーします

(?:[A-Za-z]\d ?\d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z\d]\d ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d{2} ?\d[A-Za-z]{2})|(?:[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d[A-Za-z] ?\d[A-Za-z]{2})

Android \ Javaで使用する場合は\\ dを使用します


gov.uk Webサイトから情報を取得するソリューションによる実際の有効なコードではなく、郵便番号の形式のみを検索しますが、これが最も読みやすい回答であることがわかりましたが、これは私のユースケースでは十分です。(Pythonで)少し​​遊んだ後、オプションのスペースを許可する、少しコンパクトで同等の正規表現に分解しました:([a-zA-Z](?:(?:[a-zA- Z]?\ d [a-zA-Z])|(?:\ d {1,2})|(?:[a-zA-Z] \ d {1,2}))\ W?[0 -9] [a-zA-Z] {2})
リチャードJ

14

ここでの回答のほとんどは、データベースにあるすべての郵便番号に対して機能しませんでした。政府が提供する新しい正規表現を使用して、すべてを検証するものをようやく見つけました。

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf

以前の回答には含まれていないため、リンクがダウンした場合に備えてここに投稿します。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

更新:Jamie Bullによって指摘されたように更新された正規表現。それが私のエラーのコピーなのか、それとも政府の正規表現のエラーなのかはわかりませんが、リンクがダウンしています...

更新:ctwheelsが見つかったように、この正規表現はJavaScript正規表現フレーバーで動作します。pcre(php)フレーバーで動作するものについては、彼のコメントを参照してください。


1
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$でなければなりません^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$-違いを見つける;-)
ジェイミー・ブル

1
スポット!私の答えを更新しました。ありがとう!
ヘススカレラ2014年

2
これが、regexr.comとNotepad ++で機能した唯一の回答です。私は変更していた、が、それはする([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) ?[0-9][A-Za-z]{2})(削除^$して、コメントを追加?スペースの後に)のためにregexr.com複数の結果を見つけるために、両方のためのスペースの区切り文字を持たない結果を見つけること。
mythofechelon

@ctwheelsこの正規表現は、JavaScriptフレーバー用です。リンクに失敗した場合、javascriptを選択すると機能します。それはすばらしいキャッチです。私の答えを更新します。
ヘスス・カレラ

1
ドキュメントに投稿された正規表現は本質的に正しくありません。式全体を非キャプチャグループにラップしてから、(?:)その周囲にアンカーを配置する必要があります。ここで失敗するのを見てください。詳細については、こちらの私の回答を参照してください^(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$修正された正規表現です。
ctwheels 2018

12

古い投稿ですが、それでもGoogleの検索結果はかなり高いので、更新したいと思いました。この10月14日のドキュメントでは、英国の郵便番号の正規表現を次のように定義しています。

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([**AZ**a-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

から:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf

このドキュメントでは、その背後にあるロジックについても説明しています。ただし、エラー(太字)があり、小文字も使用できます。これは、法的規定は通常ではありませんが、修正バージョンです。

^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$

これは、以前のバージョンではできなかった新しいロンドン郵便番号(例:W1D 5LH)で動作します。


太字で強調表示されているエラーはドキュメントで修正されているようですが、読みやすいように正規表現を使用することをお勧めします。
プログラミングの教授、

5
私が言う唯一のことは、スペースを\ sに変更してスペースをオプションにすることですか?スペースは読みやすさの要件ではないので。
プログラミングの教授、

ドキュメントに投稿された正規表現は本質的に正しくありません。式全体を非キャプチャグループにラップしてから、(?:)その周囲にアンカーを配置する必要があります。ここで失敗するのを見てください。詳細については、こちらの私の回答を参照してください^(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$修正された正規表現です。
ctwheels 2018

10

これは、Googleがi18napis.appspot.comドメインで提供する正規表現です。

GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}

10

郵便番号は変更される可能性があり、郵便番号を検証する唯一の真の方法は、郵便番号の完全なリストを用意して、そこにあるかどうかを確認することです。

ただし、正規表現は次の理由で役立ちます。

  • 使いやすく実装も簡単
  • 短い
  • 走るのが速い
  • 維持が非常に簡単です(郵便番号の完全なリストと比較して)
  • それでもほとんどの入力エラーをキャッチします

しかし、正規表現は、特にそもそもそれを思い付かなかった人にとって、維持するのが難しい傾向があります。だからそれはでなければなりません:

  • できるだけわかりやすい
  • 比較的将来の証拠

つまり、この回答のほとんどの正規表現は十分ではありません。たとえば[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]、それがAA1A形式の郵便番号領域と一致することがわかりますが、新しい郵便番号領域が追加されると、どの郵便番号領域が一致するかを理解することが難しいため、首が痛くなります。

また、正規表現をかっこ付きの一致として郵便番号の前半と後半に一致させる必要があります。

だから私はこれを思いついた:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})

PCRE形式では、次のように記述できます。

/^
  ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
    |
    (?:
      [BEGLMNSW] | # There are 8 single-letter postcode areas
      [A-Z]{2}     # All other postcode areas have two letters
      )
    [0-9] # There is always at least one number after the postcode area
    (?:
      [0-9] # And an optional extra number
      |
      # Only certain postcode areas can have an extra letter after the number
      (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
      [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
      )?
    )
  \s*
  ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x

私にとって、これは可能な限り検証することと、同時に将来を保証し、簡単にメンテナンスできることとの適切なバランスです。


なぜあなたが投票したのかわからない-これは、私が投げたすべての有効な郵便番号と、上記の回答の多くが正しく処理しないスペースで機能します。誰かが理由を説明したいと思いますか?
Jon

1
また、他の文字が開始や終了などに追加されたときに一致する@ジョンaSW1A 1AAasfg(それはそうと、それは簡単に修正することができても、私はdownvoteしませんでした)私のために一致
decvalts

9

私は最終日かそこらのために英国の郵便番号の正規表現を探していて、このスレッドに出くわしました。私は上記の提案のほとんどを自分の方法で行ったが、どれもうまくいかなかったので、自分の正規表現を思いついた。これは、私の知る限り、Jan '13現在のすべての有効な英国の郵便番号をキャプチャしている(最新の文献によると)ロイヤルメール)。

正規表現と簡単な郵便番号チェックのPHPコードを以下に示します。注:-小文字または大文字の郵便番号とGIR 0AA異常を許容しますが、入力された郵便番号の中央にスペースが存在する可能性が高いため、テストの前に単純なstr_replaceを使用してスペースを削除します。正規表現に対して。それ以上の不一致やロイヤルメール自体は、それらを文献で言及することすらありません(http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdfを参照)を参照し、17ページから読み始めてください)。 !

注: Royal Mail自身の文献(上記のリンク)では、3番目と4番目の位置を取り巻く曖昧さが少しあり、これらの文字が文字の場合は例外があります。私はRoyal Mailに直接連絡し、自分の言葉で「外部コードの4番目の位置にあるAANA NAA形式の文字には例外はなく、3番目の位置の例外は、外部コードの最後の文字にのみ適用されます。 ANA NAAをフォーマットします。」馬の口から真っ直ぐに!

<?php

    $postcoderegex = '/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][a-z]{1}))(\d[abd-hjlnp-uw-z]{2})?)$/i';

    $postcode2check = str_replace(' ','',$postcode2check);

    if (preg_match($postcoderegex, $postcode2check)) {

        echo "$postcode2check is a valid postcode<br>";

    } else {

        echo "$postcode2check is not a valid postcode<br>";

    }

?>

解決策を探しているこのスレッドに出くわした他の人を助けることを願っています。


1
どの例の郵便番号が公開されたものに失敗したのか知りたいのですが?
Zhaph-Ben Duguid 2013年

特定の郵便番号を指定することはできません(完全なPAFリストにアクセスできない場合)。ただし、ANA NAA形式の郵便番号は、PとQの文字が3番目の位置で許可され、AANA NAA形式の郵便番号が潜在的に失敗するため、失敗する可能性があります。また、4番目の位置ではすべての文字が許可されるため、失敗します(上記の受け入れられた回答で指定された正規表現では、これらのいずれも考慮されていません)。私が言っているのは、Royal Mailからの現在のアドバイスだけです-上記の回答の時点では、おそらくその正規表現は完全に準拠していました。
Dan Solo

ご連絡ありがとうございます。リンクされたドキュメントの3番目の位置に「P」が受け入れ可能として追加されているようですが、Qはそうではありません。私が見る限り、ドキュメントには「4番目の位置」についてはまったく記載されていないため、「実際の位置に関係なく3番目の文字」と読みました。
Zhaph-Ben Duguid 2013年

1
Royal Mailサポートチームから返信がありましたが、私のルールの解釈は正しいようです。外向きコードの4番目の文字(AANA NAAなど)には例外はなく、3番目の位置の例外は最後の文字(ANA NAAなど)にのみ適用されます。馬の口から真っ直ぐに。
Dan Solo

1
@DanSoloこの正規表現は、有効な郵便番号の前半に対して内部コードが欠落している、SW1AまたはBD25後半なしで真の一致を返します(または、少なくとも私にとってはそうでした)
decvalts

7

marcjの回答にリンクされているドキュメントで指定されている形式に基づく正規表現を次に示します。

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}$/

それと仕様の唯一の違いは、仕様によると、最後の2文字は[CIKMOV]に入れられないということです。

編集:これは、末尾の文字制限をテストする別のバージョンです。

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/

英国の郵便番号には、受け入れるよりもはるかに複雑ですA-Z- Q許可されないV、文字の位置に応じて控えめに使用されるなど。
Zhaph-Ben Duguid 2013年

2
構文チェックが必要な場合、これはおそらく無関係です。他の多くの人が述べたように、最新のデータベースでのルックアップのみがほぼ正確になり、それでもデータベースの最新性の問題があります。したがって、私にとって、この構文チェッカー正規表現は明確でシンプルで便利です。
Rick-777

5

上記の正規表現の一部は少し制限があります。正規の郵便番号に注意してください:上記の「位置3-AEHMNPRTVXYのみが使用されます」というルールの場合、「W1K 7AA」は失敗し、「K」は許可されません。

正規表現:

^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$

もう少し正確に思えます、「イギリスの郵便番号」というタイトルのWikipediaの記事を参照してくださいます。。

この正規表現は大文字のみを必要とすることに注意してください。

より大きな問題は、実際に存在する郵便番号のみを許可するようにユーザー入力を制限するのか、それとも単にユーザーがフォームフィールドに完全なゴミを入力するのを止めようとしているのかということです。可能なすべての郵便番号を正しく照合し、将来的にそれを証明することは難しいパズルであり、HMRCでない限り、おそらくそれだけの価値はありません。


郵便局は移動したように見えますが、政府は若干遅れています:(
Zhaph-Ben Duguid '25年

4
私はこれを使用します: "^([Gg] [Ii] [Rr] 0 [Aa] {2})|((([[A-Za-z] [0-9] {1,2})|(( [A-Za-z] [A-Ha-hJ-Yj-y] [0-9] {1,2})|(([[A-Za-z] [0-9] [A-Za-z ])|([A-Za-z] [A-Ha-hJ-Yj-y] [0-9]?[A-Za-z])))){0,1} [0-9] [ A-Za-z] {2})$ "大文字と小文字を区別し、スペースを任意にできるため、気に入っています。100%正確ではないとしても、使いやすさの点で優れています。
bigtv

4

英国の郵便番号の問題に対処する方法は次のとおりです。

^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$

説明:

  • 上または下のaz文字が1つまたは2つあることを期待する
  • 1つまたは2つの数字を期待する
  • 0または1 az char、上限または下限の罰金を期待する
  • オプションのスペースを許可
  • 1つの数字を期待
  • 2 az、上または下の罰金を期待

これはほとんどのフォーマットを取得します。次に、dbを使用して郵便番号が実際に本物であるかどうかを検証します。このデータは、オープンポイントによって駆動されますhttps://www.ordnancesurvey.co.uk/opendatadownload/products.html

お役に立てれば


これにより、AANNA NAA無効な形式が許可されます。
ctwheels

したがって、これは「ほとんどのフォーマットを取得する」という答えの一部です。:)
Alex Stephens

4

基本的なルール:

^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$

英国の郵便番号(または、郵便番号)は、スペースで区切られた5〜7文字の英数字で構成されています。特定の位置に登場するキャラクターをカバーするルールはかなり複雑で、例外があります。したがって、ここで示した正規表現は、基本的なルールに従っています。

完全なルール:

可読性を犠牲にして郵便番号規則のすべてのボックスをチェックする正規表現が必要な場合は、次のようにします。

^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$

出典:https : //www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

お客様のデータベースに対してテストされ、完全に正確なようです。


4

私はすべての有効な英国の郵便番号に対してテストした次の正規表現を使用します。これは推奨されるルールに基づいていますが、合理的な範囲で圧縮されており、特別な言語固有の正規表現ルールを利用していません。

([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})

郵便番号が大文字に変換されており、先頭または末尾の文字がないと想定していますが、アウトコードとインコードの間にオプションのスペースを受け入れます。

特別な「GIR0 0AA」郵便番号は除外されており、郵便番号の公式郵便局のリストに含まれていないため、検証されません。必要に応じて、特別なケースとして追加することは簡単です。


4

単純な正規表現が欲しかったので、許可しすぎても有効ですが、有効な郵便番号を拒否することはできません。私はこれに行きました(入力はストリップされた/トリミングされた文字列です):

/^([a-z0-9]\s*){5,8}$/i

これにより、「L1 8JQ」のような最短の郵便番号と「OL14 5ET」のような最長の郵便番号が許可されます。

最大8文字を許可するため、スペースがない場合は、不正な8文字の郵便番号も許可されます: "OL145ETX"。しかし、これも単純な正規表現です。これで十分です。


あ、ごめんなさい。昨日のテストで/ iを逃したようです。
John

3

郵便番号の前半有効なフォーマット

  • [AZ] [AZ] [0-9] [AZ]
  • [AZ] [AZ] [0-9] [0-9]
  • [AZ] [0-9] [0-9]
  • [AZ] [AZ] [0-9]
  • [AZ] [AZ] [AZ]
  • [AZ] [0-9] [AZ]
  • [AZ] [0-9]

例外
位置1-QVXは使用されません
位置2-GIR 0AAを除いてIJZは使用されません
位置3-AEHMNPRTVXYのみが使用されます
位置4-ABEHMNPRVWXY

郵便番号の後半

  • [0-9] [AZ] [AZ]

例外
位置2 + 3-CIKMOVは使用されません

すべての可能なコードが使用されているわけではないので、このリストは有効なコードの必要条件ですが、十分条件ではありません。すべての有効なコードのリストと照合する方が簡単な場合がありますか?


3

郵便番号を確認するには、Royal Mailのプログラマガイドに従って有効な形式になっています

          |----------------------------outward code------------------------------| |------inward code-----|
#special↓       α1        α2    AAN  AANA      AANN      AN    ANN    ANA (α3)        N         AA
^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$

doogal.co.ukのすべての郵便番号は、使用されなくなったものを除いて一致します。

?スペースの後にを追加し、大文字と小文字を区別しない一致を使用してこの質問に回答します。

'se50eg'.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig);
Array [ "se50eg" ]

3

これは、検証に失敗してサーバー側をトリミングしたくない場合に備えて、両側からの空白とタブを許可します。

^\s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})\s*$)

これは、c#(System.Text.RegularExpressions)を使用して、元の質問
MattjeS

これは英国政府の壊れた正規表現であり、有効な形式のいくつかを検証できません。
ctwheels 2018

@ctwheelsこんにちは、失敗した郵便番号を提供していただき、ありがとうございます。
Matas Vaitkevicius

たとえばAAA 1AA、有効な形式ではありません。説明と修正については、私の回答を参照しください。
ctwheels 2018

2

このリストに、ユーザーが入力できるより実用的な正規表現を追加するにempty stringは、次のとおりです。

^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

この正規表現では、大文字と小文字の間にオプションのスペースを入れることができます

ソフトウェア開発者の観点からは、この正規表現は、アドレスがオプションである可能性があるソフトウェアに役立ちます。たとえば、ユーザーが住所の詳細を提供したくない場合


1

このページのpythonコードをご覧ください。

http://www.brunningonline.net/simon/blog/archives/001292.html

郵便番号を解析する必要があります。要件はかなり単純です。郵便番号をアウトコードと(オプションで)インコードに解析する必要があります。良い点は、検証を実行する必要がないことです。提供されているものを漠然とした方法で切り取らなければなりません。大文字小文字や埋め込みスペースなど、フォーマットの観点から、インポートについて多くのことを想定することはできません。しかし、これは悪いニュースではありません。悪いニュースは、RPGですべてを実行しなければならないことです。:-(

それでも、私の考えを明確にするために、小さなPython関数を一緒に投げました。

郵便番号の処理に使用しました。


1

私たちは仕様を与えられました:

英国の郵便番号は、次のいずれかの形式である必要があります(1つの例外を除き、以下を参照)。 
    §A9 9AA 
    §A99 9AA
    §AA9 9AA
    §AA99 9AA
    §A9A 9AA
    §AA9A 9AA
ここで、Aは英字を表し、9は数字を表します。
以下のように、追加の規則がアルファベット文字に適用されます。
    §位置1の文字はQ、V、またはXであってはなりません
    §2桁目の文字はI、J、Zにはできません
    §3位の文字は、I、L、M、N、O、P、Q、R、V、X、Y、Zであってはなりません。
    §4桁目の文字は、C、D、F、G、I、J、K、L、O、Q、S、T、U、またはZであってはなりません。
    §右端の2つの位置にある文字は、C、I、K、M、O、またはVであってはなりません。
これらの一般的な規則に従わない1つの例外は、特別な有効な郵便番号である郵便番号「GIR 0AA」です。

私たちはこれを思いつきました:

/^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?\s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR\s*0AA)$/i

ただし、これにより、グループ間にスペースをいくつでも入れることができます。


2
paulslater19、残念ながらあなたのソリューションはA99A 9AA郵便番号を許可します。

1

英国の郵便番号検証の正規表現を持っています。

これは、内部または外部のすべてのタイプの郵便番号に対して機能します

^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$

これはすべてのタイプのフォーマットで機能します。

例:

AB10 -------------------->外部のポストコードのみ

A1 1AA ------------------>(外部と内部)ポストコードの組み合わせ

WC2A -------------------->アウター


1

正規表現にはタイプミスがありますが、受け入れられた回答はRoyal Mailによって与えられたルールを反映しています。このタイプミスはgov.ukサイトにもあるようです(XMLアーカイブページにあるため)。

形式A9A 9AAでは、規則は3番目の位置にP文字を許可しますが、正規表現ではこれを許可しません。正しい正規表現は次のようになります。

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

これを短くすると、次の正規表現(Perl / Ruby構文を使用)になります。

(GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))\s?[0-9][ABD-HJLNP-UW-Z]{2})

また、最初のブロックと2番目のブロックの間にオプションのスペースが含まれます。


1

ほとんどすべてのバリエーションと一括転送PDFの正規表現で私が見つけたもの、およびWikipediaサイトにあるものは、これは特にWikipediaの正規表現の場合、最初の|(縦棒)の後に^が必要です。これは、AA9A 9AAをテストすることでわかりました。それ以外の場合は、AA9A 9AAのフォーマットチェックで検証されます。たとえば、C1D 1BBは有効な形式であるため、無効であるはずのEC1D 1BBのチェックは有効に戻ります。

これが私が良い正規表現のために思いついたものです:

^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$

1

実証的なテストと観察、およびhttps://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validationによる確認を通じて、英国の郵便番号を正しく解析および検証するPython正規表現のバージョンを次に示します。

UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'

この正規表現は単純で、キャプチャグループがあります。英国の法的郵便番号の検証のすべてが含まれているわけではなく、文字と番号の位置のみが考慮されています。

コードでそれを使用する方法は次のとおりです。

@dataclass
class UKPostcode:
    postcode_area: str
    district: str
    sector: int
    postcode: str

    # https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation
    # Original author of this regex: @jontsai
    # NOTE TO FUTURE DEVELOPER:
    # Verified through empirical testing and observation, as well as confirming with the Wiki article
    # If this regex fails to capture all valid UK postcodes, then I apologize, for I am only human.
    UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'

    @classmethod
    def from_postcode(cls, postcode):
        """Parses a string into a UKPostcode

        Returns a UKPostcode or None
        """
        m = re.match(cls.UK_POSTCODE_REGEX, postcode.replace(' ', ''))

        if m:
            uk_postcode = UKPostcode(
                postcode_area=m.group('postcode_area'),
                district=m.group('district'),
                sector=m.group('sector'),
                postcode=m.group('postcode')
            )
        else:
            uk_postcode = None

        return uk_postcode


def parse_uk_postcode(postcode):
    """Wrapper for UKPostcode.from_postcode
    """
    uk_postcode = UKPostcode.from_postcode(postcode)
    return uk_postcode

単体テストは次のとおりです。

@pytest.mark.parametrize(
    'postcode, expected', [
        # https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation
        (
            'EC1A1BB',
            UKPostcode(
                postcode_area='EC',
                district='1A',
                sector='1',
                postcode='BB'
            ),
        ),
        (
            'W1A0AX',
            UKPostcode(
                postcode_area='W',
                district='1A',
                sector='0',
                postcode='AX'
            ),
        ),
        (
            'M11AE',
            UKPostcode(
                postcode_area='M',
                district='1',
                sector='1',
                postcode='AE'
            ),
        ),
        (
            'B338TH',
            UKPostcode(
                postcode_area='B',
                district='33',
                sector='8',
                postcode='TH'
            )
        ),
        (
            'CR26XH',
            UKPostcode(
                postcode_area='CR',
                district='2',
                sector='6',
                postcode='XH'
            )
        ),
        (
            'DN551PT',
            UKPostcode(
                postcode_area='DN',
                district='55',
                sector='1',
                postcode='PT'
            )
        )
    ]
)
def test_parse_uk_postcode(postcode, expected):
    uk_postcode = parse_uk_postcode(postcode)
    assert(uk_postcode == expected)

0

SAS PRXMATCHおよびと関連する機能で動作するバージョンが必要だったので、これを思いつきました。

^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$

テストケースとメモ:

/* 
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/

/*
    Bits and pieces
    1st position (any):         [A-PR-UWYZ]         
    2nd position (if letter):   [A-HK-Y]
    3rd position (A1A format):  [A-HJKPSTUW]
    4th position (AA1A format): [ABEHMNPRV-Y]
    Last 2 positions:           [ABD-HJLNP-UW-Z]    
*/


data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
cards;
1  EC1A 1BB  Special case 1
1  W1A 0AX   Special case 2
1  M1 1AE    Standard format
1  B33 8TH   Standard format
1  CR2 6XH   Standard format
1  DN55 1PT  Standard format
0  QN55 1PT  Bad letter in 1st position
0  DI55 1PT  Bad letter in 2nd position
0  W1Z 0AX   Bad letter in 3rd position
0  EC1Z 1BB  Bad letter in 4th position
0  DN55 1CT  Bad letter in 2nd group
0  A11A 1AA  Invalid digits in 1st group
0  AA11A 1AA  1st group too long
0  AA11 1AAA  2nd group too long
0  AA11 1AAA  2nd group too long
0  AAA 1AA   No digit in 1st group
0  AA 1AA    No digit in 1st group
0  A 1AA     No digit in 1st group
0  1A 1AA    Missing letter in 1st group
0  1 1AA     Missing letter in 1st group
0  11 1AA    Missing letter in 1st group
0  AA1 1A    Missing letter in 2nd group
0  AA1 1     Missing letter in 2nd group
;
run;

0

以下のメソッドは、郵便番号をチェックして完全な情報を提供します

const valid_postcode = postcode => {
    try {
        postcode = postcode.replace(/\s/g, "");
        const fromat = postcode
            .toUpperCase()
            .match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
        const finalValue = `${fromat[1]} ${fromat[2]}`;
        const regex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$/i;
        return {
            isValid: regex.test(postcode),
            formatedPostCode: finalValue,
            error: false,
            info: 'It is a valid postcode'
        };
    } catch (error) {
        return { error: true , info: 'Invalid post code has been entered!'};
    }
};
valid_postcode('GU348RR')
result => {isValid: true, formatedPostCode: "GU34 8RR", error: false, info: "It is a valid postcode"}
valid_postcode('sdasd4746asd')
result => {error: true, info: "Invalid post code has been entered!"}
valid_postcode('787898523')
result => {error: true, info: "Invalid post code has been entered!"}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.