2012-04-18 12 views
11

Ho la seguente espressione regolare che convalida il numero britannico National Insuranceespressioni regolari per convalidare UK National Insurance Number

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

valori accettati sono:

AB 12 34 56 A 

AB123456A 

voglio questi valori anche per essere accettata . qualcuno può per favore aiutarmi a risolvere questo?

AB 123456 A 

AB 123 456 A 

AB 1 2345 6 A 

    AB 12 34 56 A (multiple space anywhere) 

Il RE dovrebbe funzionare anche se nella stringa ci sono spazi aggiuntivi o assenti. È possibile farlo in RE? Grazie in anticipo.

+2

Hai dato un cattivo esempio qui che ha causato alcune delle risposte a questa domanda (compresa la risposta accettata) di essere sbagliato. Il numero NI di esempio inizia con QQ. La lettera Q non è valida in nessuna di quelle posizioni in un numero NI. Si prega di consultare la risposta di Andrew Bauer che specifica le regole di convalida coinvolte. – Barrie

risposta

27

Edit: Andrew Bauer modificato la mia risposta per aggiungere i controlli per consentiti caratteri/non consentiti che erano sconosciuti al momento ho risposto. Si dovrebbe votare la sua risposta in quanto è più completa e apparentemente esegue una migliore convalida.


Se non si può semplicemente rimuovere prima tutti gli spazi, questo dovrebbe funzionare:

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

Spiegazione:

^     # 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

Grazie per questo, e grazie per la spiegazione allegata –

2

Penso che sia meglio normalizzarlo prima (rimuovere tutti i caratteri dello spazio bianco: \s regex da sostituire con una stringa vuota), quindi convalidare.

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

In realtà, NIN non permette D, F, I, Q, U o V per le prime due lettere e non consente O per la seconda lettera; inoltre, le lettere del prefisso non possono essere BG, GB, NK, KN, TN, NT e ZZ. Anche la lettera del suffisso è A, B, C o D, ma può essere rappresentata da uno spazio se sconosciuto. - http://en.wikipedia.org/wiki/National_Insurance_number#Format

In quanto tale, un controllo più valida sarebbe (mi hanno fornito solo una versione con le lettere maiuscole, può essere facilmente modificato per minuscola):

^(?!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

Prefisso con '(? I)' [dovrebbe consentire una corrispondenza senza distinzione tra maiuscole e minuscole] (http://docs.oracle.com/javase/7/docs/api/java/ util/regex/Pattern.html # speciale). – jabley

5

Dopo aver letto tutte le risposte qui hanno determinato che non c'è una risposta chiara a questa domanda.

Con la mia espressione regolare è necessario rimuovere tutti gli spazi dalla stringa, ma in realtà dovresti farlo comunque per convalidare la maggior parte dei dati. Questo può essere ottenuto facilmente qui ci sono un paio di esempi.

PHP

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

Javascript

str.replace(/ /g,'')

Per la convalida in base al largo della consulenza governo del Regno Unito (http://www.hmrc.gov.uk/manuals/nimmanual/nim39110.htm) ho costruito la seguente espressione regolare.

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

Ecco una spiegazione di questa regex

/      # 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 

Ecco alcuni modelli di prova è possibile utilizzare

Passo

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

Fail

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

Come avevo bisogno di estendere jQuery convalidare per aggiungere questo nuovo numero di assicurazione nazionale regex Sono anche compreso questo come può essere utile per qualcuno.

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

Il '{1}' non è richiesto in quanto è implicito! –

+0

Tuttavia rende il codice più pulito e più leggibile per la persona successiva se non sa che è implicito. Dovremmo sempre cercare di scrivere codice facilmente leggibile. –