219

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

マッチ

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

歯が立たない

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

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

4

33 に答える 33

242

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

英国政府によって提供された正規表現は次のとおりです。

([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 で始まるもの) が許可され、試すことができるより厳密なテストが提供されます。

于 2008-10-02T23:13:26.197 に答える
167

私は最近、 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 番目のオプションの終了を (互いに独立して) 固定しているためです。

これが意味することは、^(asserts position at start of the line) は最初のオプションでのみ機能するため、2 番目のオプションは郵便番号で終わる([Gg][Ii][Rr] 0[Aa]{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})$
                                                                                       ^^

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

つまり、 and には一致しますが、 には一致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})$
                                                                                                                                        ^

ウェブ上で公開する前に、彼らはこのことをテストさえしなかったことを誓います. 彼らは間違った文字セットをオプションにしました。彼らは[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最初に配置しました。この郵便番号と他の郵便番号を持っている可能性が高いユーザーの数。おそらく一度も?これは、正規表現が使用されるたびに、次のオプションに進む前に最初にこのオプションを使い果たす必要があることを意味します。パフォーマンスがどのように影響を受けるかを確認するには、オプションを切り替えた後(22) 、同じ正規表現に対して元の正規表現が実行したステップ数 (35)を確認してください。

パフォーマンスに関する 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})$

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

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

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

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

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

1.Fixing the UK Government's Regex のパターンに関連して:

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

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

3.2 イギリス軍郵便局

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

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

^BFPO ?\d{1,4}$

3.3 サンタ?

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

^SAN ?TA1$
于 2018-08-16T21:08:16.177 に答える
86

を使用するようです。^(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}))$

これは海外領土をカバーせず、フォーマットを強制するだけであり、異なる地域の存在は強制しません。これは、次のルールに基づいています。

次の形式を受け入れることができます。

  • 「GIR0AA」</li>
  • 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を除く任意の文字にすることができます。

幸運をお祈りしています

コリン

于 2011-08-31T15:02:35.620 に答える
22
^([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 は使用されない ポジション - サード。Constraint - AEHMNPRTVXY は Position - Forth のみを使用しました。制約 - ABEHMNPRVWXY 郵便番号の後半 有効な形式 [0-9][AZ][AZ] 例外 位置 - 2 番目と 3 番目。制約 - CIKMOV を使用しない

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

于 2008-10-02T23:12:53.980 に答える
13

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

ここに画像の説明を入力

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

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

于 2015-04-23T10:07:34.440 に答える
13

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

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

于 2013-05-10T15:41:40.223 に答える
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) で機能します。

于 2014-11-12T12:34:55.077 に答える
11

これは、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}
于 2013-04-11T15:44:09.900 に答える
9

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

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

注: Royal Mail 自身の文献 (上記のリンク) では、3 番目と 4 番目の位置と、これらの文字が文字である場合の例外について若干曖昧な点があります。私はRoyal Mailに直接連絡して解決しましたが、彼ら自身の言葉で「AANA NAA形式のOutward Codeの4番目の文字には例外がなく、3番目の位置の例外はOutward Codeの最後の文字にのみ適用されます.形式は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>";

    }

?>

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

于 2013-01-10T12:22:03.210 に答える
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}$/
于 2011-06-08T09:10:14.570 に答える
5

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

正規表現:

^(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 でない限り、おそらくその価値はありません。

于 2011-01-25T11:44:17.530 に答える
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

顧客データベースに対してテストされ、完全に正確であると思われます。

于 2015-01-23T10:47:47.023 に答える
4

英国の郵便番号の問題にどのように対処してきたかを次に示します。

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

説明:

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

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

お役に立てれば

于 2014-08-07T07:43:58.097 に答える
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" ]
于 2015-03-27T13:44:37.443 に答える
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*$)
于 2016-01-04T14:41:22.310 に答える
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 - IJZ は GIR 0AA 以外では使用されない
位置 3 - AEHMNPRTVXY のみが使用される
位置 4 - ABEHMNPRVWXY

郵便番号の後半

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

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

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

于 2008-10-02T23:13:30.627 に答える
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}))$

この正規表現では、大文字と小文字の間に任意のスペースを入れることができます

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

于 2015-09-23T09:35:19.857 に答える
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-------------------->アウター

于 2012-05-15T12:14:09.323 に答える
1

このページの python コードを見てください。

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

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

とはいえ、私の考えを明確にするために、ちょっとした Python 関数をまとめてみました。

郵便番号を処理するために使用しました。

于 2009-10-21T11:44:33.150 に答える
1

ここには多くの答えがありますが、私はどちらにも満足していません。それらのほとんどは単に壊れているか、複雑すぎるか、壊れているだけです。

@ctwheels の回答を見たところ、非常に説明的で正しいことがわかりました。私たちは彼に感謝しなければなりません。しかし、私にとっては、あまりにも単純な「データ」が多すぎます。

幸いなことに、私はイングランドのみで 100 万を超えるアクティブな郵便番号を含むデータベースを取得することができ、結果をテストしてベンチマークするための小さな PowerShell スクリプトを作成しました。

英国の郵便番号の仕様:有効な郵便番号の形式

これは「私の」正規表現です:

^([a-zA-Z]{1,2}[a-zA-Z\d]{1,2})\s(\d[a-zA-Z]{2})$

短く、シンプルで甘い。経験の浅い人でも、何が起こっているのか理解できます。

説明:

^ asserts position at start of a line
    1st Capturing Group ([a-zA-Z]{1,2}[a-zA-Z\d]{1,2})
        Match a single character present in the list below [a-zA-Z]
        {1,2} matches the previous token between 1 and 2 times, as many times as possible, giving back as needed (greedy)
        a-z matches a single character in the range between a (index 97) and z (index 122) (case sensitive)
        A-Z matches a single character in the range between A (index 65) and Z (index 90) (case sensitive)
        Match a single character present in the list below [a-zA-Z\d]
        {1,2} matches the previous token between 1 and 2 times, as many times as possible, giving back as needed (greedy)
        a-z matches a single character in the range between a (index 97) and z (index 122) (case sensitive)
        A-Z matches a single character in the range between A (index 65) and Z (index 90) (case sensitive)
        \d matches a digit (equivalent to [0-9])
        \s matches any whitespace character (equivalent to [\r\n\t\f\v ])
    2nd Capturing Group (\d[a-zA-Z]{2})
        \d matches a digit (equivalent to [0-9])
        Match a single character present in the list below [a-zA-Z]
        {2} matches the previous token exactly 2 times
        a-z matches a single character in the range between a (index 97) and z (index 122) (case sensitive)
        A-Z matches a single character in the range between A (index 65) and Z (index 90) (case sensitive)
$ asserts position at the end of a line

結果 (郵便番号のチェック):

TOTAL OK: 1469193
TOTAL FAILED: 0
-------------------------------------------------------------------------
Days              : 0
Hours             : 0
Minutes           : 5
Seconds           : 22
Milliseconds      : 718
Ticks             : 3227185939
TotalDays         : 0.00373516891087963
TotalHours        : 0.0896440538611111
TotalMinutes      : 5.37864323166667
TotalSeconds      : 322.7185939
TotalMilliseconds : 322718.5939
于 2021-11-02T06:29:27.523 に答える
0

受け入れられた回答は、正規表現にタイプミスがありますが、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 番目のブロックの間にオプションのスペースも含まれます。

于 2015-03-31T08:00:40.447 に答える
0

仕様が与えられました:

英国の郵便番号は、次のいずれかの形式である必要があります (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 であってはなりません
これらの一般的な規則に従わない唯一の例外は、特別な有効な郵便番号である郵便番号「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

ただし、これにより、グループ間に任意の数のスペースが許可されることに注意してください。

于 2012-08-08T12:57:05.657 に答える
-1

および関連する関数を使用して 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;
于 2017-05-04T22:10:47.820 に答える