2012-04-18 128 views
11

我有以下的正則表達式,驗證了英國國家社會保險號正則表達式驗證英國國家社會保險號

^([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中可以做到嗎?先謝謝你。

+2

你在這裏給出了一個壞榜樣這已經引起了一些回答這個問題(包括接受的答案)的是錯誤的。您的示例NI編號以QQ開頭。字母Q在NI編號中的任何一個位置都是無效的。請參閱Andrew Bauer的答案,其中詳細介紹了所涉及的驗證規則。 – Barrie 2015-02-15 13:33:52

回答

27

編輯:安德魯·鮑爾修改了我的答案補充檢查對於不明在我回答的時候允許/不允許的字符。你應該提高他的答案,因爲它更完整,並且顯然會執行更好的驗證。


如果你不能只是刪除所有的空格第一,這應該工作:

^\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 
+0

感謝您的支持,並感謝您的解釋 – 2014-10-24 14:49:01

2

我認爲最好先對其進行標準化(刪除所有空白字符:\s正則表達式以空字符串替換),然後驗證。

^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$ 
33

其實,NIN不允許d,F, I,Q,U或V表示前兩個字母,不允許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)$ 
+2

使用'(?i)'前綴'[應該允許不區分大小寫的匹配](http://docs.oracle.com/javase/7/docs/api/java/ UTIL /正則表達式/ Pattern.html#特)。 – jabley 2015-02-07 20:56:40

5

這裏閱讀所有的答案我後已經確定這個問題沒有明確的答案。

用我的正則表達式,你將需要去除字符串中的所有空格,但實際上你應該這樣做來驗證大多數數據。這可以很容易地實現這裏有幾個例子。

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'); 
+0

不需要'{1}',因爲它是隱含的! – 2017-01-11 23:27:38

+0

然而,如果他們不知道它的意思,它會爲下一個人提供更清晰,更易讀的代碼。我們應該總是希望編寫易讀的代碼。 – 2017-01-12 08:11:41