2010-08-20 27 views
6

Quiero hacer coincidir una cadena como 19740103-0379 o 197401030379, es decir, el guión es opcional. ¿Cómo logro esto con regexp?Patrón Regexp Carácter opcional

+0

Especifique el idioma y/o la biblioteca de expresiones regulares que está utilizando. – reinierpost

+1

Puede usar [0-9] {8} -? [0-9] {4} – Ragnis

Respuesta

7

Por lo general, puede usar -?. Alternativamente, puede usar -{0,1} pero debería encontrar que ? para "cero o una ocurrencia de" es compatible casi en todas partes.

pax> echo 19740103-0379 | egrep '19740103\-?0379' 
19740103-0379 

pax> echo 197401030379 | egrep '19740103\-?0379' 
197401030379 

Si desea aceptar 12 dígitos con cualquier número de guiones allí en cualquier lugar, puede que tenga que hacer algo como:

-*([0-9]-*){12} 

que es básicamente cero o más guiones seguidos de 12 casos de (un dígito seguido por cero o más guiones) y capturará todo tipo de cosas maravillosas como:

--3-53453---34-4534--- 

(por supuesto, se debe utilizar en lugar de \d[0-9] si su motor regex tiene soporte para eso).

+2

Solo necesita escapar '-' en una clase de caracteres (' [...] '). Un guion no tiene ningún significado especial en ninguna parte de una expresión regular. – Richard

+0

Buena llamada, @Richard, arreglado. – paxdiablo

1

Se podría probar diferentes:

\d* coincide con una cadena que consta solamente de dígitos

\d*-\d* coincide con una cadena de dígitos de formato - tablero - dígitos

[0-9\-]* coincide con una cadena que consiste en líneas horizontales y los dígitos

puedes combinarlos a través | (o), por lo que tiene, por ejemplo, (\d*)|(\d*-\d*): partidos formatos solo digitos y digitos-dash-digits.