私は、入力文字列内でのみ完全な複雑なUK郵便番号を検証する正規表現を求めています。珍しいすべての郵便番号フォームは、通常と同様にカバーする必要があります。例えば:
一致する
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
歯が立たない
- aWC2H 7LT
- WC2H 7LTa
- WC2H
この問題を解決するにはどうすればよいですか?
私は、入力文字列内でのみ完全な複雑なUK郵便番号を検証する正規表現を求めています。珍しいすべての郵便番号フォームは、通常と同様にカバーする必要があります。例えば:
一致する
歯が立たない
この問題を解決するにはどうすればよいですか?
回答:
郵便番号については、英国政府のデータ標準をご覧になることをお勧めします[リンクは終了しました。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で始まる郵便番号など)が許可され、試行できるより厳密なテストが提供されます。
^([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|[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}))$
これは海外の地域を対象としておらず、フォーマットの適用のみを行っており、異なる地域の存在は対象としていません。次のルールに基づいています。
次のフォーマットを受け入れることができます:
どこ:
ご多幸を祈る
コリン
^(([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}))$
{0,}
で*
はなく、なぜ指定するのですか?
最近、R言語の英国の郵便番号にこの質問への回答を投稿しました。私がいることを発見し、英国政府の正規表現パターンが誤っているとして失敗し、適切にいくつかの郵便番号を検証します。残念ながら、ここでの回答の多くは、この誤ったパターンに基づいています。
以下にこれらの問題のいくつかを概説し、修正された正規表現を提供します 実際に機能ます。
私の答え(および一般的な正規表現):
不正な正規表現を気にせず、回答にスキップしたい場合は、[ 回答]セクションまでスクロールします。
このセクションの正規表現は使用しないでください。
これは、英国政府が開発者に提供した失敗した正規表現です(このリンクが有効になるまでの時間はわかりませんが、バルクデータ転送のドキュメントで確認できます)。
^([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つ(スペース)が改行文字に変更されるため、失敗します。
^([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})$
^
^([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}))$
^^ ^^
^([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 NAA
(A
文字をN
表し、数字を表す)形式であり、A
または以外で始まる場合Z
、失敗します。
つまり、A1A 1AA
and と一致しますが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})$
^
^([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})$
^
この正規表現のパフォーマンスは非常に貧弱です。まず最初に、一致する可能性が最も低いパターンオプションをGIR 0AA
最初に配置しました。他のどの郵便番号に対してこの郵便番号を持っている可能性が高いユーザーの数。おそらく決して?これは、正規表現が使用されるたびに、次のオプションに進む前に、まずこのオプションを使い果たす必要があることを意味します。パフォーマンスへの影響を確認するには、元の正規表現が実行したステップ数(35)を、オプションを反転した後の同じ正規表現(22)と比較してください。
パフォーマンスに関する2番目の問題は、全体の正規表現が構造化されているためです。失敗した場合、各オプションをバックトラックする意味はありません。現在の正規表現の構造を大幅に簡略化できます。回答セクションでこれに対する修正を提供します。
これ自体は問題とは見なされない可能性がありますが、ほとんどの開発者にとって懸念事項となります。正規表現のスペースはオプションではありません。つまり、郵便番号を入力するユーザーは郵便番号にスペースを入れる必要があります。これは、?
スペースの後に追加するだけで簡単に修正でき、オプションにできます。修正については、回答セクションを参照してください。
「問題」セクションで概説されているすべての問題を修正し、パターンを単純化すると、次の短くて簡潔なパターンが得られます。また、郵便番号全体(個々の部分ではない)を検証しているため、ほとんどのグループを削除することもできます。
^([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})$
特定のアルファベット文字を確認せずに、以下を使用できます(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}$
新しい地域、地区、準地区はいつでも表示される可能性があるため、郵便番号の過剰確認はお勧めしません。私が提案する可能性があることは、エッジケースのサポートの追加です。いくつかの特殊なケースが存在し、この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)$
ウィキペディアの記事には現在、次のように記載されています(一部の形式は若干簡略化されています):
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 11
&GE 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)$
最近、英国の郵便番号システムに合わせてBF#
(#
数字はを表す)に変更されましたが、オプションの代替郵便番号と見なされます。これらの郵便番号はの形式BFPO
に従い、その後に1〜4桁が続きます。
^BFPO ?\d{1,4}$
サンタには別の特別なケースがあります(他の回答で述べたように):SAN TA1
有効な郵便番号です。これの正規表現は非常に単純です:
^SAN ?TA1$
郵便番号を検証できる包括的な英国の郵便番号正規表現などはありません。正規表現を使用して、郵便番号が正しい形式であることを確認できます。それが実際に存在するということではありません。
郵便番号は任意に複雑で、常に変化します。たとえば、アウト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、およびマッチング会社とのコラボレーションであり、すべての英国の住所に関するすべての情報の決定的なディレクトリを作成します(かなり成功しています)。有償ですが、地方自治体、政府部門、または政府機関と協力している場合は、無料で利用できます。郵便番号が含まれているだけでなく、より多くの情報があります。
私は上記の回答の一部に見ていたと私はダンさん@からパターンを使用しないことをお勧めしたいの答え(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
無効な郵便番号のフィルタリングに関して、どのパターンが最適であるかについては何も言っていません。
^([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は使用されません
0-9
、で始まる郵便番号を使用できることを示唆しているため、これは正しいとは思わない
このウィキペディアの表によると
このパターンはすべてのケースをカバーします
(?:[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を使用します
ここでの回答のほとんどは、データベースにあるすべての郵便番号に対して機能しませんでした。政府が提供する新しい正規表現を使用して、すべてを検証するものをようやく見つけました。
以前の回答には含まれていないため、リンクがダウンした場合に備えてここに投稿します。
^([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)フレーバーで動作するものについては、彼のコメントを参照してください。
^([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})$
-違いを見つける;-)
([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複数の結果を見つけるために、両方のためのスペースの区切り文字を持たない結果を見つけること。
(?:)
その周囲にアンカーを配置する必要があります。ここで失敗するのを見てください。詳細については、こちらの私の回答を参照してください。^(?:([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}))$
修正された正規表現です。
古い投稿ですが、それでも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})$
から:
このドキュメントでは、その背後にあるロジックについても説明しています。ただし、エラー(太字)があり、小文字も使用できます。これは、法的規定は通常ではありませんが、修正バージョンです。
^(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)で動作します。
(?:)
その周囲にアンカーを配置する必要があります。ここで失敗するのを見てください。詳細については、こちらの私の回答を参照してください。^(?:([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}))$
修正された正規表現です。
これは、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}
郵便番号は変更される可能性があり、郵便番号を検証する唯一の真の方法は、郵便番号の完全なリストを用意して、そこにあるかどうかを確認することです。
ただし、正規表現は次の理由で役立ちます。
しかし、正規表現は、特にそもそもそれを思い付かなかった人にとって、維持するのが難しい傾向があります。だからそれはでなければなりません:
つまり、この回答のほとんどの正規表現は十分ではありません。たとえば[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
私にとって、これは可能な限り検証することと、同時に将来を保証し、簡単にメンテナンスできることとの適切なバランスです。
aSW1A 1AAasfg
(それはそうと、それは簡単に修正することができても、私はdownvoteしませんでした)私のために一致
私は最終日かそこらのために英国の郵便番号の正規表現を探していて、このスレッドに出くわしました。私は上記の提案のほとんどを自分の方法で行ったが、どれもうまくいかなかったので、自分の正規表現を思いついた。これは、私の知る限り、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>";
}
?>
解決策を探しているこのスレッドに出くわした他の人を助けることを願っています。
SW1A
またはBD25
後半なしで真の一致を返します(または、少なくとも私にとってはそうでした)
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
、文字の位置に応じて控えめに使用されるなど。
上記の正規表現の一部は少し制限があります。正規の郵便番号に注意してください:上記の「位置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でない限り、おそらくそれだけの価値はありません。
英国の郵便番号の問題に対処する方法は次のとおりです。
^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$
説明:
これはほとんどのフォーマットを取得します。次に、dbを使用して郵便番号が実際に本物であるかどうかを検証します。このデータは、オープンポイントによって駆動されますhttps://www.ordnancesurvey.co.uk/opendatadownload/products.html
お役に立てれば
AANNA NAA
無効な形式が許可されます。
基本的なルール:
^[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
お客様のデータベースに対してテストされ、完全に正確なようです。
私はすべての有効な英国の郵便番号に対してテストした次の正規表現を使用します。これは推奨されるルールに基づいていますが、合理的な範囲で圧縮されており、特別な言語固有の正規表現ルールを利用していません。
([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」郵便番号は除外されており、郵便番号の公式郵便局のリストに含まれていないため、検証されません。必要に応じて、特別なケースとして追加することは簡単です。
郵便番号の前半有効なフォーマット
例外
位置1-QVXは使用されません
位置2-GIR 0AAを除いてIJZは使用されません
位置3-AEHMNPRTVXYのみが使用されます
位置4-ABEHMNPRVWXY
郵便番号の後半
例外
位置2 + 3-CIKMOVは使用されません
すべての可能なコードが使用されているわけではないので、このリストは有効なコードの必要条件ですが、十分条件ではありません。すべての有効なコードのリストと照合する方が簡単な場合がありますか?
郵便番号を確認するには、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" ]
これは、検証に失敗してサーバー側をトリミングしたくない場合に備えて、両側からの空白とタブを許可します。
^\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*$)
このリストに、ユーザーが入力できるより実用的な正規表現を追加するに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}))$
この正規表現では、大文字と小文字の間にオプションのスペースを入れることができます
ソフトウェア開発者の観点からは、この正規表現は、アドレスがオプションである可能性があるソフトウェアに役立ちます。たとえば、ユーザーが住所の詳細を提供したくない場合
このページのpythonコードをご覧ください。
http://www.brunningonline.net/simon/blog/archives/001292.html
郵便番号を解析する必要があります。要件はかなり単純です。郵便番号をアウトコードと(オプションで)インコードに解析する必要があります。良い点は、検証を実行する必要がないことです。提供されているものを漠然とした方法で切り取らなければなりません。大文字小文字や埋め込みスペースなど、フォーマットの観点から、インポートについて多くのことを想定することはできません。しかし、これは悪いニュースではありません。悪いニュースは、RPGですべてを実行しなければならないことです。:-(
それでも、私の考えを明確にするために、小さなPython関数を一緒に投げました。
郵便番号の処理に使用しました。
私たちは仕様を与えられました:
英国の郵便番号は、次のいずれかの形式である必要があります(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
ただし、これにより、グループ間にスペースをいくつでも入れることができます。
英国の郵便番号検証の正規表現を持っています。
これは、内部または外部のすべてのタイプの郵便番号に対して機能します
^((([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 -------------------->アウター
正規表現にはタイプミスがありますが、受け入れられた回答は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番目のブロックの間にオプションのスペースが含まれます。
ほとんどすべてのバリエーションと一括転送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})$
実証的なテストと観察、および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)
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;
以下のメソッドは、郵便番号をチェックして完全な情報を提供します
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!"}