En nuestro tutorial anterior sobre expresiones regulares en JavaScript, aprendió sobre la utilidad de las expresiones regulares y cómo escribir algunas propias para que coincidan con patrones simples.
Después de leer el tutorial anterior, ahora debería tener una buena comprensión de los caracteres especiales como una barra invertida y secuencias de caracteres como \ w
o \ W
. Aquí hay un resumen muy rápido de esas secuencias de caracteres:
\re
o \RE
para hacer coincidir un dígito o un carácter que no sea un dígito respectivamente en cualquier cadena dada Los caracteres de dígitos incluyen 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. El resto de los caracteres se compararán con \RE
.\ w
o \ W
para hacer coincidir una palabra o un carácter no-palabra en cualquier cadena dada. Los caracteres de las palabras incluyen alfabetos, dígitos y guiones bajos. Todo lo demás, como ₹,%, etc., se considera un carácter sin palabra.\ s
o \ S
para hacer coincidir caracteres de espacio o caracteres no espaciales en una cadena. Los caracteres de espacio incluyen espacio, tabulación, avance de página y avance de línea.En lugar de hacer coincidir un carácter a la vez, puede usar el *
símbolo para que coincida con la expresión anterior cero o más veces. los +
el carácter coincidirá de manera similar con la expresión anterior 1 o más veces.
Puedes hacer coincidir un patrón un número específico de veces añadiendo n, m
lo. aquí, norte
es el número mínimo de veces que quieres que coincida, y metro
Es el límite máximo. Si no especifica un valor para metro
, La expresión anterior se emparejará tantas veces como sea posible..
Debería revisar mi tutorial anterior si algo que acabamos de cubrir no está claro. Le expliqué todo con más detalle allí..
Ahora, pasemos a algunas secuencias de caracteres más sofisticadas en expresiones regulares, para que pueda aprovecharlas al máximo y descubrir cómo escribir expresiones que coincidan con patrones complicados..
?
Personajelos ?
carácter significa diferentes cosas en diferentes situaciones.
Cuando se usa solo, este carácter coincide con la expresión que vino antes de 0 o 1 veces. En este sentido, es lo mismo que 0,1
.
También puedes usar ?
Inmediatamente después de otros cuantificadores como *
, +
y para que coincida con el mínimo número posible de caracteres. En otras palabras, convertirá esos cuantificadores codiciosos en no codiciosos. Esto puede ser un poco difícil de entender sin mirar ejemplos en vivo, así que veamos un ejemplo primero.
Considera la siguiente oración:
Se me asignó 17321HDGE como identificación de usuario, mientras que a mi amigo se le asignó FHES193EK1.
Ahora, veamos todas las coincidencias que habrían sido devueltas por diferentes cuantificadores y su contraparte no codiciosa.
Si usamos la expresión / \ d + / g
en el ejemplo, coincidirá con uno o más caracteres de dígitos consecutivos. Debido a la bandera global, habrá tres partidos: 17321, 193, y 1.
Usted debe tener en cuenta que 193 y 1 Se consideran coincidencias diferentes porque están separadas por EK.
El siguiente ejemplo muestra las coincidencias sin el uso de ningún cuantificador.
var re = / \ d + / g; cuenta var = 0; var textString = "Me asignaron 17321HDGE como ID de usuario, mientras que a mi amigo le asignaron FHES193EK1."; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * Salida 17321 193 1 total de coincidencias: 3 * /
Ahora, añadiendo un ?
personaje después \re+
Volverá nueve partidos diferentes. Básicamente, / \ d +? /
convertirá cada carácter de dígito en una coincidencia separada. Porqué es eso?
Es porque \re+
Por definición, se supone que coincide con uno o más dígitos. Desde el ?
se supone que el carácter coincide con el número mínimo posible de caracteres, solo coincide con un solo dígito a la vez.
El no codicioso ?
el cuantificador devolverá 9 coincidencias de un solo dígito más pequeñas esta vez. Para mayor brevedad, he comentado la línea que registra las coincidencias en la consola.
var re = / \ d +? / g; cuenta var = 0; var textString = "Me asignaron 17321HDGE como ID de usuario, mientras que a mi amigo le asignaron FHES193EK1."; var match = re.exec (textString); while (match! == null) // console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * Partidas totales de salida: 9 * /
Tomemos otro ejemplo. La expresion regular / \ w + /
mantendrá la coincidencia de los caracteres de las palabras siempre y cuando no estén interrumpidos por un espacio que no sea una palabra, como el espacio. En nuestro caso, coincidirá con palabras separadas por espacios enteros como asignado y 17321HDGE una vez.
Si reemplazamos nuestra expresión regular original con / \ w + /
, Obtendremos 14 partidos diferentes. Básicamente, cada palabra será su propia coincidencia. Puedes ver la salida tú mismo comentando la línea.
var re = / \ w + / g; cuenta var = 0; var textString = "Me asignaron 17321HDGE como ID de usuario, mientras que a mi amigo le asignaron FHES193EK1."; var match = re.exec (textString); while (match! == null) // console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * Partidas totales de salida: 14 * /
Ahora, cambiando la expresión a / \ w +? /
devolverá cada carácter de palabra como una coincidencia por separado, y obtendrás 68 coincidencias.
Echemos un vistazo a un último ejemplo antes de continuar. La expresion regular / \ w 4, /
devolverá todas las palabras de nuestra oración que tengan cuatro caracteres o más. Entonces coincide tener, estado, asignado, y 17321HDGE, entre otros. Ahora volviéndolo a / \ w 4,? /
devolvería múltiples coincidencias de palabras con más de cuatro caracteres. En nuestro ejemplo, las coincidencias devueltas serían tener, estado, asilo, gned, 1732, y 1HGD. El personaje mi al final de 17321HDGE no es parte de ningún partidoporque no puede estar en el grupo de cuatro caracteres de palabra consecutivos.
var re = / \ w 4, / g; cuenta var = 0; var textString = "Me asignaron 17321HDGE como ID de usuario, mientras que a mi amigo le asignaron FHES193EK1."; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * A la salida se le asignó un usuario 17321HDGE mientras que un amigo asignó FHES193EK1 Total Matches: 9 * /
En mi anterior tutorial de expresiones regulares, cubrí brevemente cómo se pueden usar los paréntesis para recordar parte de una coincidencia. Cuando se usa con un ?
carácter, pueden servir para otros fines, así.
A veces, quieres que un grupo de personajes coincida como una unidad. Por ejemplo, podría estar buscando las ocurrencias de n / A Una o dos veces como partido en el siguiente texto..
na na nna na nana naana
Para aclaración, está buscando el texto en negrita como coincidencias: n / A n / Aunn / Auna (nana) n / Aunan / A. La parte entre paréntesis se supone que debe coincidir como una unidad, por lo que solo cuenta como una coincidencia.
Casi todos los que recién comienzan con expresiones regulares utilizarán la expresión / na 1,2 /
Con la intención de obtener el resultado esperado. En sus mentes, la 1,2 Se supone que una parte debe coincidir con una o dos apariciones de norte y una juntos. Sin embargo, en realidad coincide con una sola aparición de norte seguido de 1 o 2 apariciones del personaje una.
He rendido los partidos devueltos por / na 1,2 /
en negrita para aclarar: n / A naa nortenaa (na) (na) (naa) (na). Las partes en los soportes son partidos separados. Como puede ver, no estamos obteniendo el resultado que queríamos porque 1,2
no esta considerando n / A ser una sola unidad que tiene que ser emparejada.
La solución aquí es usar paréntesis para indicar a JavaScript que coincida n / A como una unidad. Sin embargo, como vimos en el tutorial anterior, JavaScript comenzará a recordar la coincidencia debido a los paréntesis.
Si no desea que JavaScript recuerde la coincidencia, tendrá que agregar ?:
antes del grupo de caracteres que está intentando hacer coincidir. En nuestro caso, la expresión final se convertiría en / (?: na) 1,2 /
. El grupo n / A será igualado como una unidad ahora, y no será recordado. He resaltado las coincidencias finales devueltas con esta expresión en negrita: n / A n / Aunn / Auna (nana) n / Aunan / A.
El siguiente ejemplo registra todas las coincidencias en la consola. Dado que hay 6 partidos en total, el recuento total de partidos es de 6.
var re = / (?: na) 1,2 / g; cuenta var = 0; var textString = "na naa nnaa nana naana"; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * Salida na na na nana na na Total de coincidencias: 6 * /
Hay muchas situaciones en las que buscamos coincidir con un conjunto de caracteres dado, pero solo si son seguidos o no por otro conjunto de caracteres. Por ejemplo, podrías estar buscando la palabra manzanas en un texto, pero solo queremos aquellas coincidencias que son seguidas por son. Considera la siguiente oración.
las manzanas son deliciosas Comimos manzanas todo el día. A todos los que comieron manzanas les gustaron..
En el ejemplo anterior, solo queremos que la primera palabra coincida. Cualquier otra aparición de la palabra no debe estar en los partidos.
Una forma de lograr esto es usar la siguiente expresión regular a (? = b)
. La palabra que queremos hacer coincidir es una, y la palabra que debe venir después una es segundo. En nuestro caso, la expresión se convertiría en / manzanas (? = \ sare) /
. Recuerda que la palabra son no está incluido en este partido.
var re = / apples (? = \ sare) / g; cuenta var = 0; var textString = "las manzanas son deliciosas. Comimos manzanas todo el día. A todos los que comieron manzanas les gustaron". var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * Manzanas de salida Total Matches: 1 * /
Esta expresión regular, en la que observamos lo que sigue en la cadena antes de decidir si la palabra es una coincidencia, se llama lookahead.
Una situación muy similar surgiría si decidieras emparejar manzanas solo si era no seguido de un conjunto específico de caracteres. En tales casos, necesita reemplazar ?=
con ?!
en tu expresion regular Si estuviéramos buscando todas las ocurrencias de manzanas cuales son no seguido por son, usaremos / manzanas (?! \ sare) /
Como nuestra expresión regular. Habrá dos coincidencias exitosas para nuestra oración de prueba.
var re = / apples (?! \ sare) / g; cuenta var = 0; var textString = "las manzanas son deliciosas. Comimos manzanas todo el día. A todos los que comieron manzanas les gustaron". var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); cuenta ++; console.log ("Total Matches:" + count); / * Salida manzanas manzanas Partidas totales: 2 * /
Una cosa más: no es necesario usar dos expresiones regulares separadas para encontrar todas las coincidencias seguidas de cualquiera de las dos palabras. Todo lo que tienes que hacer es agregar el operador de tubería entre esas palabras y listo. Por ejemplo, si está buscando todas las apariciones de Apple seguidas de son o fueron, Deberías usar / manzanas (?! \ sare | \ swere) /
como tu expresión regular.
En este tutorial, aprendimos cómo escribir expresiones regulares complicadas para que coincidan con los patrones que estamos buscando. Podemos usar el especial. ?
para devolver el número mínimo requerido del carácter anterior como una coincidencia. Del mismo modo, podemos utilizar el ?
entre paréntesis para asegurarse de que no se recuerde el grupo que estábamos haciendo coincidir.
Finalmente, aprendimos que el ?=
y ?!
las secuencias de caracteres en una expresión regular nos dan la oportunidad de devolver un conjunto particular de caracteres como una coincidencia solo si son seguidos o no por otro conjunto dado de caracteres.
Si tiene alguna pregunta relacionada con este tutorial, no dude en hacérmelo saber y haré todo lo posible para explicarlas..