2012-04-18 11 views
11

He la siguiente expresión regular que valida el número de seguridad social británicade expresiones regulares para validar Reino Unido Nacional de Seguros Número

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

valores aceptados son:

AB 12 34 56 A 

AB123456A 

quiero estos valores también para ser aceptada . ¿Alguien puede ayudarme a resolver esto?

AB 123456 A 

AB 123 456 A 

AB 1 2345 6 A 

    AB 12 34 56 A (multiple space anywhere) 

El RE debería funcionar incluso si no son de pago o no hay espacios en la cadena. ¿Es esto posible de hacer en RE? Gracias de antemano.

+2

Usted ha dado un mal ejemplo aquí lo que ha provocado algunas de las respuestas a esta pregunta (incluyendo la respuesta aceptada) a equivocarse. Su número NI de ejemplo comienza con QQ. La letra Q no es válida en ninguna de esas posiciones en un número NI. Consulte la respuesta de Andrew Bauer, que detalla las reglas de validación involucradas. – Barrie

Respuesta

27

Editar: Andrew Bauer modificado mi respuesta para agregar controles de caracteres permitidos/no permitidos que eran desconocidos en el momento respondí. Debería votar su respuesta porque es más completa y aparentemente realiza una mejor validación.


Si no se puede simplemente eliminar todos los espacios en blanco en primer lugar, esto debería funcionar:

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

Explicación:

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

Gracias por esto, y gracias por la explicación que lo acompaña –

2

Creo que es mejor normalizarlo primero (elimine todos los caracteres de espacio en blanco: \s regex para reemplazar con una cadena vacía), luego valide.

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

En realidad, NIN no permite D, F, I, Q, U o V para las dos primeras letras y no permite O para la segunda letra; Además de esto, las letras de prefijo no pueden ser BG, GB, NK, KN, TN, NT y ZZ. También la letra del sufijo es A, B, C o D, pero puede representarse por un espacio si es desconocido. - http://en.wikipedia.org/wiki/National_Insurance_number#Format

Como tal, una comprobación más válida sería (que sólo han suministrado una versión con letras mayúsculas, puede ser fácilmente alterado por minúscula):

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

Prefijo con '(? I)' [debería permitir una coincidencia que no distinga entre mayúsculas y minúsculas] (http://docs.oracle.com/javase/7/docs/api/java/ util/regex/Pattern.html # special). – jabley

5

Después de leer todas las respuestas aquí han determinado que no hay una respuesta clara a esta pregunta.

Con mi expresión regular deberá quitar todos los espacios de la cadena, pero realmente debería hacerlo de todos modos para validar la mayoría de los datos. Esto se puede lograr fácilmente aquí hay un par de ejemplos.

PHP

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

Javascript

str.replace(/ /g,'')

Para la validación basada en el asesoramiento de gobierno del Reino Unido (http://www.hmrc.gov.uk/manuals/nimmanual/nim39110.htm) que construye la siguiente expresión regular.

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

Aquí es una explicación de esta expresión regular

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

Éstos son algunos patrones de prueba se puede utilizar

Pass

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

no se

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

Como necesitaba para extender jQuery validar añadir este nuevo número de seguridad social de expresiones regulares También estoy incluyendo esta, ya que puede ser útil para alguien.

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

¡El '{1}' no es necesario ya que está implícito! –

+0

Sin embargo, genera un código más limpio y legible para la siguiente persona si no saben que está implícito. Siempre debemos buscar escribir un código fácil de leer. –

Cuestiones relacionadas