5

Asp.Net Webサイトがあり、RegularExpressionValidatorを使用して、英国の郵便番号が英語(つまり、スコットランド、ウェールズ、またはアイルランドではない)であるかどうかを確認したいと思います。

最初のセグメント(郵便番号エリアと呼ばれる)からの文字だけを使用して、郵便番号が英語であるかどうかを確認できるはずです。合計で124の郵便番号エリアがあり、これはそれらのリストです。

そのリストから、次の郵便番号エリアはイギリスにありません。

  • ZE、KW、IV、HS、PH、AB、DD、PA、FK、G、KY、KA、DG、TD、EH、ML(スコットランド)
  • LL、SY、LD、HR、NP、CF、SA(ウェールズ)
  • BT(北アイルランド)

正規表現への入力は、郵便番号全体の場合もあれば、郵便番号領域のみの場合もあります。

特定の郵便番号が英語の場合にのみ一致する正規表現を作成するのを手伝ってくれる人はいますか?

編集-解決策

いくつかのポスターの助けを借りて、1500を超えるテストケースに対してテストした次の正規表現を作成することができました。

^(AL | B | B [ABDHLNRS] | C [ABHMORTVW] | D [AEHLNTY] | E | E [CNX] | FY | G [LUY] | H [ADGPUX] | I [GM‌ P] ‌ | JE | KT | L | L [AENSU] | M | ME | N | N [EGNRW] | O [LX] | P [ELOR] | R [GHM] | S | S [EGKLMNOPRSTW] | T [AFNQ‌‌ RSW ] | UB | W | W [ACDFNRSV] | YO)\ d {1,2} \ s?(\ d [\ w] {2})?

4

6 に答える 6

10

私はすでに一度答えたことがありますが、100% 正しいイングランドのみの正規表現を考え出すことは不可能であると指摘しています (郵便番号の地域は政治的な境界に沿っていないため)。

しかし、私はこれをもう少し深く掘り下げました...まあ、それ可能ですが、それは大変な作業です.

イギリスのみの郵便番号を確認するには、英語以外の郵便番号を除外する必要があります。簡単なものは次のとおりです。

  • BT (北アイルランド)
  • IM (マン島)
  • JE(ジャージー)
  • GG (ガーンジー)
  • BF(イギリス軍)
  • BX (非地理的な英国の郵便番号)
  • GIR (非地理的でもある Girobank)

(セントヘレナ、ジブラルタルなど、英国外の領土の英国スタイルの郵便番号については言及しません。技術的に言えば、マン島とチャネル諸島も英国の一部ではありませんが、はるかに近いです。によって、英国のロイヤル メール システムとより密接に結びついています。)

純粋にスコットランドの郵便番号エリアは次のとおりです(あなたが言及したように):

ZE、KW、IV、HS、PH、AB、DD、PA、FK、G、KY、KA、EH、ML

DGTDは名目上スコットランド人であり、大部分はスコットランドにいます。ただし、次のようにスコットランドとイングランドの国境をまたぐ地域もあります。

  • DG16 - イギリスのほんの少し
  • TD9 - イギリスのほんの少し
  • TD12 - イングランドの半分
  • TD15 - 主にイングランド

内訳は次のとおりです。

DG16は、次の英語の郵便番号を除いてスコットランドにあります。

  • DG16 5H[ツズ]
  • DG16 5J[AB]

TD9 0T[JPRSTUW]を除いて、TD9 はスコットランドにあります。

TD12には 1 つのセクター (TD12 4) しかなく、イングランドとスコットランドにおよそ半分ずつ広がっています。

  • TD12 4[ABDEHJLN]はスコットランドにいます
  • TD12 4[QRSTUWX]はイギリスにいます

TD15が最も複雑です。3 つのセクターがあり、そのうちTD15 2TD15 9は完全にイングランドにあります。

TD15 1はイングランドとスコットランドに分かれています。

スコットランドでは、次のように始まる郵便番号があります。

  • TD15 1T
  • TD15 1X

... これらの英語の郵便番号を除く:

  • TD15 1T[ABQUX]
  • TD15 1XX

TD15 1 の他のすべての郵便番号は、次のように始まるものを除き、イングランドにあります。

  • TD15 1B
  • TD15 1S (すなわちTD15 1S[ABEJLNPWXY] )
  • TD15 1U (すなわちTD15 1U[BDENPQRTUXY] )

...スコットランドにある次の郵便番号を除いて、すべてイングランドにあります。

  • TD15 1BT
  • TD15 1S[ウズ]
  • TD15 1U[FGHJLSZ]

英語の郵便番号エリアCANEは、イングランドとスコットランドの国境の反対側にありますが、スコットランドにまで及ぶことはありません。

実際、英国の郵便番号の最後の 2 文字は、(私の知る限り) 郵便配達員が実際に郵便物を配達する方法に基づいているため、政治的な境界内に収まることは当然ではありません。したがって、国境にまたがる家のグループがある場合、郵便番号全体 (つまり、最も細かいレベルで) が完全にイングランドまたはスコットランド内にあるわけではない可能性があります。たとえば、 TD9 0TJTD15 1UZは国境に非常に近く、完全に片側にあるかどうかはよくわかりません。

イングランドとウェールズの国境も複雑ですが、これは読者の課題として残しておきます。

于 2013-08-02T23:36:10.447 に答える
4

英国には 124 の郵便番号エリアがあります。

- PAF® 統計 2012 年 8 月イギリスの郵便番号リスト (ウィキペディア)より

問題を 2 つの部分に分割することをお勧めします ( functionsと考えてください)。

  1. 郵便番号は有効ですか?

    英国の郵便番号の正規表現 (包括的)

  2. 郵便番号は英語ですか?

    これはさらに分解できます。

    • スコットランド人ではない:
      • ! /^(ZE|KW|IV|HS|PH|AB|DD|PA|FK|G|KY|KA|DG|TD|EH|ML)[0-9]/
    • ウェールズ語ではない:
      • ! /^(LL|SY|LD|HR|NP|CF|SA)[0-9]/
    • チャンネル諸島出身の北アイルランド、マンクスではありません...
      • など...
    • または、最適化する方法に応じて、郵便番号エリアが 100 ほどの英語エリアに含まれていることを確認することもできます ☻

構文はプログラミング言語によって異なることに注意してください。これらすべてを 1 つの正規表現で行うと、すぐに管理できなくなります。

于 2012-03-07T20:25:23.023 に答える
3

郵便番号エリアは、少なくとも郵便番号エリアまたは地区レベルでは、政治的境界に沿っていないため、イングランドのみの正規表現を作成することはできません。

たとえば、CH1はイギリスにあり、CH5はウェールズにあります。

郵便番号地区レベルでは、まだ問題があります。たとえば、TD12はイギリスで半分、スコットランドで半分です。

信頼できるのはBT(北アイルランド)だけです。

于 2012-11-30T00:04:21.783 に答える
1

を使用^(AB|AL|B| ... )$します。ここで ... は、パイプ ( ) で区切られた残りの有効なものを入力する場所です|

編集: ここには大量の情報があります: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

in/out コードを含めると、 のよう^(AB|AL|B| ... )([\d\w]{3})\s([\d\w]{3})$になり、残りのコードが取得されます。

編集

^(A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[CNX]?|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTWY]?|T[AFNQRSW]|UB|W[ACDFNRSV]?|YO|ZE)([\w\d]{1,2})\s?([\w\d]{3})$

この正規表現の一部は、別の回答から取得されます。{1,2}有効な郵便番号、1 ~ 2 個の文字\wまたは数字\d、オプションのスペース、3 個の文字または数字の順に一致し\s?ます。それが役立つことを願っています。

于 2012-03-07T20:09:58.323 に答える
1

これらは、すべての英国の郵便番号タイプに対して Royal Mail が定義した標準に従ってまとめられた RegEx i です。

標準の英国の郵便番号:

/^([A-PR-UWYZ](?:[0-9]{1,2}|[0-9][A-HJKMNPR-Y]|[A-HK-Y][0-9]{1,2}|[A-HK-Y][0-9][ABEHMNPRVWXY]))\s*([0-9][ABD-HJLNP-UW-Z]{2})$/i

GiroBank 郵便番号:

/^(GIR)\s*(0AA)$/i

英国の海外領土:

/^([A-Z]{4})\s*(1ZZ)$/i

イギリス軍郵便局:

/^(BFPO)\s*(?:(c\/o)\s*)?((?(2)[0-9]{1,3}|[0-9]{1,4}))$/i

そして、これは私が書いた関数で、これら 4 つのタイプに対して郵便番号を検証し、タイプの検出を可能にします。

public function UKPostCode(&$strPostCode, &$strError = null, &$strType = null, $ReturnFormatted = true) {
    $strStrippedPostCode = preg_replace("/[\s\-]/i", "", $strPostCode);

    if (empty($strStrippedPostCode)) {
        $strError = $this->__getErrorMessage("Post", "EMPTY_POST");
        return false;

    }

    $arrRegExp = array(
        "STD" => "/^([A-PR-UWYZ](?:[0-9]{1,2}|[0-9][A-HJKMNPR-Y]|[A-HK-Y][0-9]{1,2}|[A-HK-Y][0-9][ABEHMNPRVWXY]))\s*([0-9][ABD-HJLNP-UW-Z]{2})$/i",
        "GIR" => "/^(GIR)\s*(0AA)$/i",
        "OST" => "/^([A-Z]{4})\s*(1ZZ)$/i",
        "BFPO" => "/^(BFPO)\s*(?:(c\/o)\s*)?((?(2)[0-9]{1,3}|[0-9]{1,4}))$/i"
    );

    foreach ($arrRegExp as $strPostCodeType => $strExpression) {

        if (preg_match($strExpression, $strPostCode, $arrMatches)) {

            if ($ReturnFormatted !== null) {
                array_shift($arrMatches);
                $strPostCode = implode(" ", array_filter($arrMatches));
                $strPostCode = ((bool)$ReturnFormatted === true) ? strtoupper($strPostCode) : strtolower($strPostCode);

            }

            $strType = $strPostCodeType;
            return true;

        }

    }

    $strError = $this->__getErrorMessage("Post", "INVALID_POST");
    return false;

}

お役に立てれば

于 2013-07-17T18:25:52.413 に答える
0
'A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[CNX]?|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTWY]?|T[AFNQRSW]|UB|W[ACDFNRSV]?|YO|ZE'
于 2012-03-07T20:18:56.607 に答える