6

重複の可能性:
英国の郵便番号の正規表現 (包括的)

JavaScriptで郵便番号を検証するための次のコードがあります。

function valid_postcode(postcode) {
    postcode = postcode.replace(/\s/g, "");
    var regex = /[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2}/i;
    return regex.test(postcode);
}

テスト:

CF47 0HW - Passes - Correct
CF47 OHW - Passes - Incorrect

私は大量の調査を行いましたが、この一般的な検証要件の決定的な正規表現を見つけることができないようです。誰かが私を正しい方向に向けてもらえますか?

4

3 に答える 3

8

^ と $ を追加して、正規表現をより厳密にします。これはうまくいくはずです:

function valid_postcode(postcode) {
    postcode = postcode.replace(/\s/g, "");
    var regex = /^[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2}$/i;
    return regex.test(postcode);
}
于 2012-12-20T10:02:50.907 に答える
8

「決定的な正規表現」が必要です-英国の郵便番号のすべての順列を考えると、「不必要に大きく」する必要があります。過去に使ったのはこちら

"(GIR 0AA)|((([ABCDEFGHIJKLMNOPRSTUWYZ][0-9][0-9]?)|(([ABCDEFGHIJKLMNOPRSTUWYZ][ABCDEFGHKLMNOPQRSTUVWXY][0-9][0-9]?)|(([ABCDEFGHIJKLMNOPRSTUWYZ][0-9][ABCDEFGHJKSTUW])|([ABCDEFGHIJKLMNOPRSTUWYZ][ABCDEFGHKLMNOPQRSTUVWXY][0-9][ABEHMNPRVWXY])))) [0-9][ABDEFGHJLNPQRSTUWXYZ]{2})"

たとえば、AZ だけを使用することは決してないことに注意してください。なぜなら、各部分には常に特定の文字が除外されているからです。

于 2012-12-20T10:38:26.830 に答える
1

問題は、関数の最初の行です。ターゲット文字列からスペースを削除することで、誤検知を許可します。

CF47OHW は [AZ]{1,2}[0-9]{1,2} ?[0-9][AZ]{2} と一致します

CF matches [A-Z]
4 matches [0-9]{1,2}
(blank) matches \s?
7 matches [0-9]
OH matches [A-Z]{2}
W gets discarded

したがって、Paulgrav が述べているように、開始文字と終了文字 (^ と $) を追加すると修正されます。

その時点で、\s? を削除することもできます。正規表現の途中から少し。

でも!バグが修正されたにもかかわらず、正規表現はまだ期待どおりに機能しません。このサイトUK Postcode Regex (Comprehensive)で、次のかなり良い回答を確認する必要があります。

于 2012-12-20T10:30:31.093 に答える