質問

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

一致

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

勝ち目がない

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

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

役に立ちましたか?

解決

郵便番号については、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})

Wikipediaの議論で指摘されているように、これにより、一部の非実際の郵便番号(たとえば、AA、ZYから始まる郵便番号)が許可され、より厳密なテストを提供できます。

他のヒント

使うことになるようです ^(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-郵便番号. 。これは、次の 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」
  • 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 を除く任意の文字を指定できます。

幸運をお祈りしています

コリン

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

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

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

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

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

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

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| ASCN 1ZZ | Ascension Island                             |
| STHL 1ZZ | Saint Helena                                 |
| TDCU 1ZZ | Tristan da Cunha                             |
| BBND 1ZZ | British Indian Ocean Territory               |
| BIQQ 1ZZ | British Antarctic Territory                  |
| FIQQ 1ZZ | Falkland Islands                             |
| GX11 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

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

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

最近回答 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})|(([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})$
                                                                                        ^

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

それはは、 A1A 1AA および 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})|(([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})$
                                                                                                                                        ^

問題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(グループ9)の4番目のサブオプションで [0-9] オプションを作成しました。これにより、 AAA 1AA などの誤った形式の郵便番号に正規表現を一致させることができます。

この問題を解決するには、代わりに次の文字クラスをオプションにします(その後、セット [0-9] を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})$

問題5-パフォーマンス

この正規表現のパフォーマンスは非常に悪いです。まず、最初に GIR 0AA に一致する可能性が最も低いパターンオプションを配置しました。この郵便番号を他の郵便番号と比較して持つ可能性が高いユーザーの数。おそらく決して?これは、正規表現が使用されるたびに、次のオプションに進む前にこのオプションを使い果たす必要があることを意味します。パフォーマンスへの影響を確認するには、元の正規表現が< a href = "https://regex101.com/r/ajQHrd/6" rel = "noreferrer">オプションを切り替えた後の同じ正規表現(22)。

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

問題6-スペース

使用中の正規表現を見る

これは本質的に問題とはみなされないかもしれませんが、ほとんどの開発者にとって懸念を引き起こします。正規表現のスペースはオプションではありません。つまり、ユーザーが郵便番号を入力する場合、郵便番号にスペースを入れる必要があります。これは、スペースの後にオプションでを追加するだけで簡単に修正できます。修正方法については、[回答]セクションをご覧ください。


回答

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

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

使用中の正規表現を見る

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

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

使用中の正規表現はこちら

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

[0-9] \ d に置き換えます(正規表現エンジンがサポートしている場合):

使用中の正規表現をご覧ください

^([A-Z]{1,2}\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 0AA を気にしない場合:

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

3。複雑なパターン

郵便番号を新しい地域として過度に検証することはお勧めしません、Dist

上記の回答のいくつかを見て、@ Danの answer(c。Dec 15 '10)。有効な郵便番号のほぼ0.4%が誤って無効であるとフラグ付けされますが、その他はそうではありません。

兵器調査は、コードポイントオープンと呼ばれるサービスを提供します。

  

英国の現在のすべての郵便番号ユニットのリストが含まれています

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

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



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



'^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}

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

'^.*

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%)
<*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0
<*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%)
<*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%) <*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0 <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%) <*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%) <*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0 <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%) <*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%) <*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 0 <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

# => 6016 (0.36%) <*> <*>

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

<*>

無効な郵便番号を除外するのに最適なパターンについては何も言っていません。

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

有効な英国に一致する正規表現   郵便番号。英国の郵便制度では   すべての文字がすべての位置で使用されます   (車両登録と同じ   プレート)とに様々なルールがあります   これを管理します。この正規表現は   それらのルールを考慮してください。の詳細   ルール:郵便番号の前半有効   フォーマット[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]例外   位置-最初。制約-QVXではありません   使用位置-2番目。制約-   IJZはGIR 0AA以外では使用されません   位置-3番目。制約-   AEHMNPRTVXYは位置のみを使用しました-   フォース。制約-ABEHMNPRVWXY秒   郵便番号の半分有効な形式   [0-9] [A-Z] [A-Z]例外位置-   2番目と3番目。制約-CIKMOV   使用されていない

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

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

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

UPDATE:Jamie Bullが指摘した正規表現を更新しました。コピーのエラーか、政府の正規表現のエラーかはわかりませんが、リンクは現在ダウンしています...

UPDATE:ctwheelsが見つけたように、この正規表現はjavascript正規表現フレーバーで動作します。 pcre(php)フレーバーで動作するコメントについては、彼のコメントをご覧ください。

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

ここに画像の説明を入力

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

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

古い投稿ですが、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})$

from:

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など)で機能します。

これは、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&#8212;の郵便番号エリアに一致することがわかります。しかし、新しい郵便番号エリアが追加された場合、どの郵便番号エリアが一致するかを理解するのが難しいため、首が痛くなるでしょう。

また、正規表現が郵便番号の前半と後半を括弧で囲まれた一致として一致するようにします。

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

(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

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

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

正規表現と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の形式のOutward Codeの4番目の位置にある文字には例外はなく、3番目の位置の例外はOutward Codeの最後の文字にのみ適用されます」 ANA NAAという形式です。&quot;馬の口からまっすぐ!

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

    }

?>

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

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

上記の正規表現の一部は少し制限されています。本物の郵便番号に注意してください:&quot; W1K 7AA&quot;ルール「位置3-AEHMNPRTVXYのみを使用」を指定すると失敗します。上記の「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})$

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

この正規表現には大文字のみが必要です。

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

基本的なルール:

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

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

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

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

  • [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は使用されません

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

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

^([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を使用して郵便番号が実際に本物かどうかを検証します。このデータはopenpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html

これがお役に立てば幸いです

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

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

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

長さ5から7(空白はカウントしない)は、「L1 8JQ」などの可能な限り短い郵便番号を許可することを意味します。 「OL14 5ET」のような最長のものも同様です。

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

このリストに、ユーザーが 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関数を一緒に投げました。

これを使用して郵便番号を処理しました。

仕様が与えられました:

UK postcodes must be in one of the following forms (with one exception, see below): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
where A represents an alphabetic character and 9 represents a numeric character.
Additional rules apply to alphabetic characters, as follows:
    § The character in position 1 may not be Q, V or X
    § The character in position 2 may not be I, J or Z
    § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z
    § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z
    § The characters in the rightmost two positions may not be C, I, K, M, O or V
The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.

これを思いつきました:

/^([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 --------------------&gt;外部郵便番号のみ

     

A1 1AA ------------------&gt;(外側と内側)郵便番号の組み合わせ

     

WC2A --------------------&gt;外部

受け入れられた回答は、正規表現にタイプミスがありますが、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のほぼすべてのバリエーションと正規表現で見つかったものと、ウィキペディアのサイトにあるのは、特にウィキペディアの正規表現の場合、最初の|(垂直バー)の後に^が必要です。それ以外の場合は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})$

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

XMLドキュメントからこれを盗み、ハードコードされたGIROなしですべてのケースをカバーしているようです:

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top