webdevqa.jp.net

一致する英国郵便番号の正規表現

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

一致

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

一致なし

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

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

166
Kieran Benton

郵便番号については、UK Government Data Standardをご覧になることをお勧めします。 XMLのアーカイブ 、詳細は Wikipedia をご覧ください]。データに関する簡単な説明があり、添付のxmlスキーマは正規表現を提供します。正確にあなたが望むものではないかもしれませんが、良い出発点になるでしょう。 RegExはXMLとは少し異なります。形式A9A 9AAの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})

ウィキペディアの議論で指摘されているように、これにより、いくつかの非実際の郵便番号(たとえば、AA、ZYから始まる郵便番号)が許可され、試してみることができるより厳密なテストが提供されます。

181
marcj

^(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 Schema の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を除く任意の文字です。

ご多幸を祈る

コリン

81
Colin

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

郵便番号はarbitrarily意的に複雑であり、絶えず変化しています。たとえば、アウトコードW1は、郵便番号エリアごとに1〜99のすべての数値を持たず、また決して持つこともありません。

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

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

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

次に、BFPOの郵便番号があります。これは、現在は より標準的な形式に変更 です。両方の形式が有効になります。最後に、海外の領土があります ソースウィキペディア

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

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

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

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

  • Royal Mailが Postcode Address File(PAF) をリリースしました。これにはBFPOが含まれますが、Code-Point Openがそうするかどうかはわかりません。それは定期的に更新されますが、お金がかかります(そして、彼らはそれについて実に意地悪かもしれません)。 PAFには単なる郵便番号ではなく完全な住所が含まれ、独自の Programmers Guide が付属しています。 Open Data User Group(ODUG)は現在、PAFを無料でリリースするようにロビー活動を行っています ここに彼らの立場の説明があります

  • 最後に、 AddressBase があります。これは、すべての英国住所に関するすべての情報の明確なディレクトリを作成するためのOrdnance Survey、Local Authority、Royal Mail、および一致する会社とのコラボレーションです(かなり成功しています)。有償ですが、地方自治体、政府機関、または政府のサービスを利用している場合、無料で使用できます。郵便番号だけでなく、はるかに多くの情報があります。

42
Ben

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

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


注意

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

  • 郵便番号formatsのみを検証します。
  • 郵便番号が正当に存在することを保証しません.
    • これには、適切なAPIを使用してください!詳細については、 Benの答え を参照してください。

bad regexを気にせず、答えにスキップしたい場合は、Answerセクション。

悪い正規表現

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

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

^([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番目のオプションはendの文字列を検証します郵便番号(以前の内容に関係なく)。

同様に、最初のオプションは$行の最後に固定されていないため、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})$
                                                                                       ^^

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

つまり、A1A 1AAZ1A 1AAは一致しますが、B1A 1AAは一致しません。

この問題を修正するには、文字-をそれぞれの文字セットのAZの間に配置する必要があります。

^([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})$
                                                                                                                                        ^

私は彼らがこのことをウェブで公表する前にテストさえしなかったと誓います。間違った文字セットをオプションにしました。彼らは、オプション2の4番目のサブオプション(グループ9)に[0-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番目の問題は、正規表現全体の構造に起因します。失敗した場合、各オプションをバックトラックすることは意味がありません。現在の正規表現の構造を大幅に簡素化できます。この修正をAnswerセクションで提供します。

問題6-スペース

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

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


回答

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

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

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

^([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.複雑なパターン

新しいエリア、地区、地区はいつでも表示される可能性があるため、郵便番号の過剰検証はお勧めしません。私が提案するpotentiallyは、エッジケースのサポートを追加します。いくつかの特殊なケースが存在し、 このウィキペディアの記事 で概説されています。

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:Tristan da Cunha
  • BBND 1ZZ:イギリス領インド洋地域
  • BIQQ 1ZZ:イギリス領南極地域
  • FIQQ 1ZZ:フォークランド諸島
  • GX11 1ZZ:ジブラルタル
  • PCRN 1ZZ:ピトケアン諸島
  • SIQQ 1ZZ:サウスジョージアおよびサウスサンドイッチ諸島
  • TKCA 1ZZ:タークスおよびカイコス諸島
  • BFPO 11:アクロティリとデケリア
  • ZZ 11GE CX:バミューダ( このドキュメント による)
  • KY1-1111:ケイマン諸島( このドキュメント による)
  • VG1111:英領バージン諸島( このドキュメント による)
  • MSR 1111:Montserrat( このドキュメント による)

英国の海外領土のみに一致する包括的な包括表現は、次のようになります。

使用中の正規表現を参照

^((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##は数字を表す)に合わせるために最近変更されましたが、optionalの代替郵便番号と見なされます。これらの郵便番号は、BFPOの形式の後に続き、1から4桁の数字が続きます。

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

^BFPO ?\d{1,4}$

3.3サンタ?

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

^SAN ?TA1$
35
ctwheels

上記の回答のいくつかを見て、@ Danの answer(c。Dec 15 '10) のパターンを使用しないことをお勧めします。なぜなら、有効な郵便番号のほぼ0.4%無効ですが、他はそうではありません。

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

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

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

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と一致するnotである有効な郵便番号の数です。

'^([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

無効な郵便番号を除外することに関して、どのパターンが最適であるかについては何も言っていません。

20
RichardTowers
^([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番目。制約-GIR 0AAポジション以外ではIJZは使用されません-3番目。制約-AEHMNPRTVXYはPosition-Forthのみを使用しました。制約-ABEHMNPRVWXY郵便番号の後半有効な形式[0-9] [A-Z] [A-Z]例外の位置-2番目と3番目。制約-CIKMOVは使用されません

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

17
Dan

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

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)フレーバーで動作するものについては、彼のコメントを参照してください。

14
Jesús Carrera

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

enter image description here

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

(?:[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を使用します

12
AntPachon

古い投稿ですが、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など)で機能します。

12
deadcrab

これは、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
Alix Axel

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

ただし、正規表現は次の理由で便利です。

  • 使いやすく、実装が簡単です
  • 短いです
  • すぐに実行できます
  • 保守が非常に簡単です(郵便番号の全リストと比較して)
  • まだほとんどの入力エラーをキャッチ

しかし、正規表現は、特にそもそもそれを思い付かなかった人にとっては、維持するのが難しい傾向があります。したがって、次のようにする必要があります。

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

つまり、この回答の正規表現のほとんどは十分ではありません。例えば。 [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

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

10
andre

私は最後の日かそこらで英国の郵便番号の正規表現を探していましたが、このスレッドにつまずきました。私は上記の提案のほとんどを自分のやり方で行いましたが、どれも私のために働いていませんでしたので、私が知る限り、13年1月の時点で有効なすべての英国の郵便番号をキャプチャする独自の正規表現を考え出しました(最新の文献によるとロイヤルメール)。

正規表現といくつかの簡単な郵便番号チェック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に直接連絡して解決し、「AANA NAA形式の外向きコードの4番目の位置にある文字には例外はなく、3番目の位置の例外は外向きコードの最後の文字にのみ適用されます。 ANA AAAをフォーマットします。」馬の口から真っ直ぐに!

<?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>";

    }

?>

このスレッドに出会って解決策を探している他の誰にも役立つことを願っています。

9
Dan Solo

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}$/
7
Will Tomlins

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

正規表現:

^(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})$

もう少し正確なようです。 「イギリスの郵便番号」というタイトルのウィキペディアの記事 をご覧ください。

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

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

5
minglis

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

([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})

郵便番号が大文字に変換され、先頭または末尾の文字がないことを前提としていますが、outcodeとincodeの間のオプションのスペースを受け入れます。

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

4
Chisel

基本ルール:

^[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
Raphos

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

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

説明:

  • 1〜2個のa〜z文字、上位または下位のファインを期待する
  • 1つまたは2つの数字が必要です
  • 0または1のa-z文字、上位または下位のファインを期待する
  • 許可されるオプションのスペース
  • 1つの数字を期待する
  • 2 a-z、上または下の罰金を期待する

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

お役に立てれば

3
Alex Stephens

これにより、検証に失敗してサーバー側をトリミングしたくない場合に備えて、両側から空のスペースとタブを使用できます。

^\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*$)
3

郵便番号の前半有効な形式

  • [A-Z] [A-Z] [0-9] [A-Z]
  • [A-Z] [A-Z] [0-9] [0-9]
  • [A-Z] [0-9] [0-9]
  • [A-Z] [A-Z] [0-9]
  • [A-Z] [A-Z] [A-Z]
  • [A-Z] [0-9] [A-Z]
  • [A-Z] [0-9]

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

郵便番号の後半

  • [0-9] [A-Z] [A-Z]

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

考えられるすべてのコードが使用されているわけではないことに注意してください。したがって、このリストは、有効なコードの必要条件ですが、十分な条件ではありません。すべての有効なコードのリストと照合する方が簡単かもしれませんか?

3
Martin Beckett

郵便番号を確認するには、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
Jackson Pauls

私は単純な正規表現が欲しかったので、多すぎることは許されますが、有効な郵便番号を否定することはできません。私はこれを使いました(入力は削除/トリミングされた文字列です):

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

長さ5〜7(空白を含まない)は、「L1 8JQ」のような最短の郵便番号と「OL14 5ET」のような最長の郵便番号を許可することを意味します。

編集:8文字を7文字に変更したため、8文字の郵便番号は許可されません。

3
Henrik N

このリストに、ユーザーが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}))$

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

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

2
user1

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

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

郵便番号の解析を行う必要があります。要件は非常に簡単です。郵便番号をアウトコードと(オプション)インコードに解析する必要があります。良い点は、検証を実行する必要がないことです-提供されたものを漠然とインテリジェントな方法で切り刻むだけです。大文字と小文字や埋め込みスペースなどの書式設定に関して、インポートについてあまり推測できません。しかし、これは悪いニュースではありません。悪いニュースは、RPGですべてを行わなければならないことです。 :-(

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

私はそれを使って郵便番号を処理しました。

1
Rudiger Wolf

正規表現にはタイプミスがありますが、受け入れられた答えは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
Stieb

バルク転送pdfのほぼすべてのバリエーションと正規表現で見つかったもの、およびウィキペディアのサイトにあるのは、特にウィキペディアの正規表現の場合、最初の|(垂直バー)の後に^が必要です。それ以外の場合はA9A 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
Andrew Schliewe

仕様が与えられました:

英国の郵便番号は、次のいずれかの形式にする必要があります(1つの例外を除き、以下を参照)。
§A9 9AA 
§A99 9AA 
§AA9 9AA 
§AA99 9AA 
§A9A 9AA 
§AA9A 9AA 
ここで、Aはアルファベット文字を表し、9は数字を表します。
追加の規則は、次のようにアルファベット文字に適用されます。 
§位置1の文字はQ、V、Xであってはなりません
§位置2の文字はI、J、Zであってはなりません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 
これらの一般規則に従わない例外は、特別な有効な郵便番号である郵便番号「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

ただし、これはグループ間に任意の数のスペースを許可します。

1
paulslater19

UK Postcode検証の正規表現があります。

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

^((([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
Swift-Master

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

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!"}
0
Aathi

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
user667489

私はこれをXML文書から盗み、ハードコードされたGIROなしですべてのケースをカバーしているようです:

%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(大文字と小文字を区別しないルビー構文)

0
Ghoti