25

英国国民保険番号を検証する次の正規表現があります

^([a-zA-Z]){2}( )?([0-9]){2}( )?([0-9]){2}( )?([0-9]){2}( )?([a-zA-Z]){1}?$

受け入れられる値は次のとおりです。

AB 12 34 56 A

AB123456A

この価値観も受け入れてほしい。誰でもこれを整理するのを手伝ってもらえますか?

AB 123456 A

AB 123 456 A

AB 1 2345 6 A

    AB   12   34   56 A    (multiple space anywhere)

RE は、文字列に余分なスペースがある場合やスペースがない場合でも機能するはずです。REでこれを行うことは可能ですか?前もって感謝します。

4

9 に答える 9

61

実際、NIN では最初の 2 文字に D、F、I、Q、U、または V を使用できず、2 番目の文字に O を使用できません。また、接頭辞に BG、GB、NK、KN、TN、NT、ZZ を使用することはできません。また、サフィックス文字は A、B、C、D のいずれかですが、不明な場合はスペースで表すことができます。- http://en.wikipedia.org/wiki/National_Insurance_number#Format

そのため、より有効なチェックは次のようになります (大文字のバージョンのみを提供しましたが、小文字に簡単に変更できます)。

^(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)(?:[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z])(?:\s*\d\s*){6}([A-D]|\s)$
于 2013-07-22T03:33:54.837 に答える
34

編集: Andrew Bauer が私の回答を修正して、私が回答した時点で不明だった許可/禁止された文字のチェックを追加しました。彼の答えはより完全であり、明らかにより良い検証を実行するため、彼の答えに賛成票を投じるべきです。


最初にすべての空白を削除できない場合は、これでうまくいくはずです。

^\s*[a-zA-Z]{2}(?:\s*\d\s*){6}[a-zA-Z]?\s*$

説明:

^                 # beginning of string
\s*               # optional leading whitespace
[a-zA-Z]{2}       # match two letters
(?:\s*\d\s*){6}   # six digits, with optional whitespace leading/trailing
[a-zA-Z]?         # zero or one letter
\s*               # optional trailing whitespace (just in case)
$                 # end of string
于 2012-04-18T07:11:44.153 に答える
6

ここですべての回答を読んだ後、この質問に対する明確な回答はないと判断しました。

私の正規表現では、文字列からすべてのスペースを取り除く必要がありますが、実際にはほとんどのデータを検証するためにこれを行う必要があります。これは簡単に実現できます。いくつかの例を次に示します。

PHP

preg_replace('/(\s+)|(-)/', '', $str)

Javascript

str.replace(/ /g,'')

英国政府のアドバイス ( http://www.hmrc.gov.uk/manuals/nimmanual/nim39110.htm ) に基づく検証のために、次の正規表現を作成しました。

/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D]{1}$/i

これがこの正規表現の説明です

/                      # Wraps regex
^                      # Beginning of string
[A-CEGHJ-PR-TW-Z]{1}   # Match first letter, cannot be D, F, I, Q, U or V
[A-CEGHJ-NPR-TW-Z]{1}  # Match second letter, cannot be D, F, I, O, Q, U or V
[0-9]{6}               # Six digits
[A-D]{1}               # Match last letter can only be A, B, C or D
$                      # End of string
/i                     # Ending wrapper and i denotes can be upper or lower case

使用できるいくつかのテスト パターンを次に示します。

合格

AA 11 22 33 A
BB 44 55 66 B
ZZ 67 89 00 C

失敗

AA 11 22 33 E
DA 11 22 33 A
FA 11 22 33 A
AO 11 22 33 A

この新しい国民保険番号の正規表現を追加するために jQuery 検証を拡張する必要があったため、誰かにとって役立つ可能性があるため、これも含めています。

jQuery.validator.addMethod('nino', function(nino, element) {
            return this.optional(element) || nino.length >= 9 &&
                nino.replace(/ /g,'').match(/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D]{1}$/i);
        }, 'Please specify a valid national insurance number');
于 2015-12-03T13:39:50.280 に答える
5

\s最初に正規化(すべての空白文字を削除:正規表現を空の文字列に置き換える)してから検証する方が良いと思います。

^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$
于 2012-04-18T07:04:07.940 に答える