Digamos que tenemos una cadena como +7 (903) -123-45-67 y queremos encontrar todos los números en ella. Pero contrastando el ejemplo anterior, no estamos interesados en un solo dígito, sino en números completos: 7, 903, 123, 45, 67.
Un número es una secuencia de 1 o más dígitos \d. Para marcar cuántos necesitamos, podemos agregar un cuantificador.
Cantidad {n}
El cuantificador más simple es un número entre llaves: {n}.
Se agrega un cuantificador a un carácter (o a una clase de caracteres, o a un conjunto [...], etc) y especifica cuántos necesitamos.
Tiene algunas formas avanzadas, veamos los ejemplos:
- El recuento exacto:
{5} -
\d{5}Denota exactamente 5 dígitos, igual que\d\d\d\d\d.El siguiente ejemplo busca un número de 5 dígitos:
Podemos agregar
\bpara excluir números largos:\b\d{5}\b. - El rango:
{3,5}, coincide 3-5 veces -
Para encontrar números de 3 a 5 dígitos, podemos poner los límites en llaves:
\d{3,5}Podemos omitir el límite superior
Luego, una regexp
\d{3,}busca secuencias de dígitos de longitud3o más:
Volvamos a la cadena +7(903)-123-45-67.
Un número es una secuencia de uno o más dígitos continuos. Entonces la expresión regular es \d{1,}:
Abreviaciones
Hay abreviaciones para los cuantificadores más usados:
+-
Significa “uno o más”, igual que
{1,}.Por ejemplo,
\d+busca números: ?-
Significa “cero o uno”, igual que
{0,1}. En otras palabras, hace que el símbolo sea opcional.Por ejemplo, el patrón
ou?rbuscaoseguido de cero o unou, y luegor.Entonces,
colou?rencuentra amboscolorycolour: *-
Significa “cero o más”, igual que
{0,}. Es decir, el carácter puede repetirse muchas veces o estar ausente.Por ejemplo,
\d0*busca un dígito seguido de cualquier número de ceros (puede ser muchos o ninguno):Compáralo con
+(uno o más):
Más ejemplos
Los cuantificadores se usan con mucha frecuencia. Sirven como el “bloque de construcción” principal de expresiones regulares complejas, así que veamos más ejemplos.
Regexp para fracciones decimales (un número con coma flotante): \d+\.\d+
En acción:
Regexp para una “etiqueta HTML de apertura sin atributos”, tales como <span> o <p>.
-
La más simple:
/<[a-z]+>/iLa regexp busca el carácter
'<'seguido de una o más letras latinas, y el carácter'>'. -
Mejorada:
/<[a-z][a-z0-9]*>/iDe acuerdo al estándar, el nombre de una etiqueta HTML puede tener un dígito en cualquier posición excepto al inicio, tal como
<h1>.
Regexp para “etiquetas HTML de apertura o cierre sin atributos”: /<\/?[a-z][a-z0-9]*>/i
Agregamos una barra opcional /? cerca del comienzo del patrón. Se tiene que escapar con una barra diagonal inversa, de lo contrario, JavaScript pensaría que es el final del patrón.
Podemos ver una regla común en estos ejemplos: cuanto más precisa es la expresión regular, es más larga y compleja.
Por ejemplo, para las etiquetas HTML debemos usar una regexp más simple: <\w+>. Pero como HTML tiene normas estrictas para los nombres de etiqueta, <[a-z][a-z0-9]*> es más confiable.
¿Podemos usar <\w+> o necesitamos <[a-z][a-z0-9]*>?
En la vida real, ambas variantes son aceptables. Depende de cuán tolerantes podamos ser a las coincidencias “adicionales” y si es difícil o no eliminarlas del resultado por otros medios.