2012-10-08 10 views
20

Me gustaría obtener una expresión regular que sea X o Y con caracteres de longitud. Por ejemplo, una cadena que tenga 8 u 11 caracteres de largo. Actualmente lo he implementado así: ^([0-9]{8}|[0-9]{11})$.Coincidir con la longitud específica x o y

También podría implementar como: ^[0-9]{8}([0-9]{3})?$

Mi pregunta es: ¿Puedo tener esta expresión regular sin duplicar la parte [0-9] (que es más compleja que esta simple \d ejemplo)?

Respuesta

31

hay una manera:

^(?=[0-9]*$)(?:.{8}|.{11})$ 

o, alternativamente, si usted quiere hacer el cheque longitud en primer lugar,

^(?=(?:.{8}|.{11})$)[0-9]*$ 

De esta manera, tiene la parte complicada una sola vez y la . genérica para la verificación de la longitud.

Explicación:

^  # Start of string 
(?=  # Assert that the following regex can be matched here: 
[0-9]* # any number of digits (and nothing but digits) 
$  # until end of string 
)  # (End of lookahead) 
(?:  # Match either 
.{8} # 8 characters 
|  # or 
.{11} # 11 characters 
)  # (End of alternation) 
$  # End of string 
+0

Muy bien ... Tendré que aprender más acerca de estos lookaheads :) – Laoujin

+1

Cuidado: Si toma el '^ (? = [0-9] * $) (?:. {8} |. {11}) $ 'versión, podría ser un error para IE5-8 como se explica [aquí] (http://blog.stevenlevithan.com/archives/regex-lookahead-bug). Cambie a la versión alternativa de Tim y funciona para todos los navegadores. – Laoujin

+0

Tenga en cuenta que ambas versiones no son compatibles con el esquema XML debido al grupo que no captura (? :). – user1056903

1

con Perl, usted podría hacer:

my $re = qr/here_is_your_regex_part/; 
my $full_regex = qr/$re{8}(?:$re{3})?$/ 
+1

Cerrar, pero se perdió un} después de '$ re {3' – mrk

+0

@mrk: Buena captura, gracias. – Toto

0

Para aquellos de nosotros en busca de capturar diferentes longitudes del mismo múltiplo probar esto.

^(?:[0-9]{32})+$

Dónde 32 es el múltiplo que desea capturar todas las longitudes de (32, 64, 96, ...).

Cuestiones relacionadas