Escribir un patrón de expresiones regulares

Un patrón de expresiones regulares está compuesto de caracteres simples, como /abc/; o una combinación de caracteres simples y especiales, como /ab*c/ o /Capítulo (d+).d*/. El último ejemplo incluye paréntesis, los cuales se usan como un dispositivo de memoria.

Usar patrones simples

Los patrones simples se construyen con caracteres para los cuales se busca una coincidencia directa. Por ejemplo: /abc/ coincide con las combinaciones de caracteres en cadenas solamente cuando exactamente los caracteres abc aparecen juntos y en ese orden. Una coincidencia se encontraría en las cadenas Hi, do you know your abcs? y The latest airplane designs evolved from slabcraft.. En ambos casos la coincidencia es con la subcadena abc. Por ejemplo, no habría coincidencia con la cadena Grab crab porque no contiene la subcadena abc.

Usar caracteres especiales

Cuando la búsqueda de una coincidencia requiere más que una coincidencia directa, como la búsqueda de una o más veces, o buscar un espacio en blanco, el patrón incluye caracteres especiales. Por ejemplo, el patrón /ab*c/ coincide con cualquier combinación de caracteres en la que se encuentre una única a seguida de cero o más b (* significa 0 o más ocurrencias del elemento que le precede) e inmediatamente seguido de una c. En la cadena cbbabbbbcdebc, el patrón coincide con la subcadena abbbbc.

La siguiente tabla muestra una lista completa de los caracteres especiales que pueden ser empleados en expresiones regulares.

Caracter Significado
Alguno de los siguientes:

  • Para caracteres que generalmente son tratados como literales, indica que el siguiente caracter es un caracter especial y no debe ser interpretado como un literal. Por ejemplo, /b/ coincide con el carácter b. Sin embargo, colocando una barra invertida (backslash) antes de la b, usando así /b/, el carácter se convierte en especial significando un límite de palabra.
  • Para caracteres que generalmente son tratados como especiales, indica que el siguiente caracter no es especial y debería ser interpretado como un literal. Por ejemplo, * es un caracter especial que significa 0 o más ocurrencias del elemento que le precede; por ejemplo, /a*/ significa cero o más letras a. Para encontrar un * literalmente, hay que precederlo de una barra invertida; por ejemplo, /a*/ coincide con a*.
^ Coincide al principio de la entrada. Si la bandera multilínea es configurada como verdadera, también coincide inmediatamente después de un caracter de salto de línea. Por ejemplo, /^U/ no coincide con la U en una U, pero sí coincide con la primera U en Una U.
$ Coincide al final de la entrada. Si la bandera multilínea es configurada como verdadera, también coincide inmediatamente antes de un caracter de salto de línea. Por ejemplo, /t$/ no coincide con la t en eater, pero sí lo hace en eat.
* Coincide con el caracter que le precede 0 o más veces. Por ejemplo, /bo*/ coicide con boooo en A ghost booooed y b en A bird warbled, pero no en A goat grunted.
+ Coincide con el caracter que lo precede 1 o más veces. equivalente a {1,}. Por ejemplo, /a+/ coincide con la a en candy y todas las letras a en caaaaaaandy.
? Coincide con el caracter que lo precede 0 o 1 vez.Por ejemplo, /e?le?/ coincide con el en angel y con le en angle.Si se utiliza inmediatamente después de alguno de los cuantificadores *, +, ?, o {}, transforma el cuantificador en no codicioso (coincidiendo con el mínimo número de elementos posibles), en contraposición al funcionamiento por defecto, en el que se comportan de forma codiciosa (concordando con el máximo número de elementos posibles). También utilizado en las instrucciones predictivas [lookahead assertions], descritas como x(?=y) y x(?!y) más abajo en esta tabla.
. El punto decimal coincide con cualquier carácter simple excepto con el de nueva línea. Por ejemplo, /.n/ coincide con an y con on en nay, an apple is on the tree, pero no con nay.
(x) coincide con x y recuerda la coincidencia. Son llamados paréntesis con memoria [capturing parentheses]. Por ejemplo, /(foo)/ coincide y recuerda foo en foo bar. La subcadena coincidente puede ser rellamada usando el vector de elementos resultante [1], …, [n].
(?:x) Coincide con x pero no recuerda la coincidencia. Son llamados paréntesis sin memoria [non-capturing parentheses]. La subcadena coincidente no puede ser rellamada usando el vector de elementos resultante [1], …, [n].
x(?=y) Coincide con x solo si x está seguida de y. Por ejemplo, /Jack(?=Sprat)/ coincide con Jack sólo si es seguido de Sprat. /Jack(?=Sprat|Frost)/ coincide con Jack sólo si es seguido de Sprat o Frost. Sin embargo, ni Sprat ni Frost forman parte de la coincidencia resultante.
x(?!y) Coincide con x sólo si x no está seguida de y. Por ejemplo, /d+(?!.)/ coincide con un número sólo si este no está seguido de un punto decimal. La expresión regular /d+(?!.)/.exec(3.141) coincide con 141 pero no con 3.141.
x|y Coincide con x o y. Por ejemplo, /green|red/ coincide con green en green apple y red en red apple.
{n} Donde n es un entero positivo. Coincide exactamente con n ocurrencias del caracter que lo precede. Por ejemplo, /a{2}/ no coincide con la a en candy, pero si coincide con todas las letras a en caandy, y las primeras dos aes en caaandy.
{n,} Donde n es un entero positivo. Coincide con al menos n ocurrencias del caracter que le precede. Por ejemplo, /a{2,} no coincide con la a en candy, Pero coincide con todas las letras a en caandy y en caaaaaaandy.
{n,m} Donde n y m son enteros positivos. Coincide con al menos n ocurrencias y como mucho con m del caracter que le precede. Por ejemplo, /a{1,3}/ no coincide con nada en cndy, pero sí con la a en candy, las primeras dos aes en caandy, y las primeras tres aes en caaaaaaandy. Nótese que al buscar coincidencia con caaaaaaandy, la coincidencia es aaa, a pesar de que la cadena original tuviese más aes.
[xyz] Un conjunto de caracteres. Coincide con cualquiera de los caracteres que están entre corchetes. Puede especificar un rango de caracteres usando un guón. Por ejemplo, [abcd] es lo mismo que [a-d]. Esto debería coincidir con la b en brisket y la c en ache.
[^xyz] Un conjunto de caracteres complementado o negado. Coincide con cualquier cosa que no esté encerrada entre los corchetes. Puede especificar un rango de caracteres usando un guión. Por ejemplo, [^abc] es lo mismo que [^a-c]. Inicialmente coincidiría con r en brisket y la h en chop.
[b] Coincide con el carácter de retroceso (backspace). (No confundir con b)
b Coincide con un límite de palabra, como el espacio o el carácter de nueva línea. (No confundir con [b]). Por ejemplo, /bnw/ coincide con no en noonday; /wyb/ coincide con ly en possibly yesterday.
B Coincide con un caracter que no sea límite de palabra. Por ejemplo, /wBn/ coincide con on en noonday, y /yBw/ coincide con ye en possibly yesterday.
cX Donde X es un caracter de control. Coincide con un caracter de control en una cadena. Por ejemplo, /cM/ coincide con control-M en una cadena.
d Coincide con un dígito. Es equivalente a [0-9]. Por ejemplo, /d/ o /[0-9]/ coincide con 2 en B2 is the suite number.
D Coincide con un caracter que no sea un dígito. Es equivalente a [^0-9]. Por ejemplo, /D/ o /[^0-9]/ coinciden con B en B2 is the suite number.
f Coincide con un avance de forma [form-feed].
n Coincide con un avance de línea [linefeed].
r Coincide con un retorno de carro.
s Coincide con un único caracter de espaciado, incluyendo el espacio, tabulado, form feed, line feed. Es equivalente a [fnrtvu00A0u2028u2029]. Por ejemplo, /sw*/ coincide con bar en foo bar.
S Coincide con un único caracter que no sea de espaciado. Es equivalente a [^ fnrtvu00A0u2028u2029].Por ejemplo, /Sw*/ coincide con foo en foo bar.
t Coincide con un tabulado.
v Coincide con un tabulado vertical.
w Coincide con cualquier caracter alfanumérico incluido el subrayado. Es equivalente a [A-Za-z0-9_]. Por ejemplo, /w/ coincide con a en apple, 5 en $5.28, y 3 en 3D.
W Coincide con cualquier caracter no alfanumérico ni subrayado. Es equivalente a [^A-Za-z0-9_]. Por ejemplo, /W/ o /[^$A-Za-z0-9_]/ coincide con % en 50%.
n Donde n es un entero positivo. Referencia a la última coincidencia del grupo n de parentesis de la expresión regular (contando parentesis izquierdos). Por ejemplo, /apple(,)sorange1/ coincide con apple, orange, en apple, orange, cherry, peach.
Coincide con el caracter NUL. No debe seguirse con ningún dígito.
xhh Coincide con el caracter que tiene código hh (dos digitos hexadecimales)
uhhhh Coincide con el caracter que tiene como código hhhh (cuatro dígitos hexadecimales).

Usar paréntesis

Los paréntesis que rodean cualquier parte de un patrón de expresión regular causan que la parte de la subcadena coincidente se recuerde. Una vez recordada, la subcadena puede ser llamada para otro uso.

Por ejemplo, el patrón /Chapter (d+).d*/ muestra caracteres especiales y caracteres adicionales de escape e indica que parte del patrón debe ser recordada. Coincide precisamente con los caracteres Chapter seguidos de uno o más caracteres numéricos (d significa cualquier caracter numérico y + significa 1 o más veces), seguidos por un punto decimal (el cual es un caracter especial: anteponer al punto decimal significa que el patrón debe buscar el caracter . literalmente), seguido por un caracter numérico 0 o más veces (d significa caracter numérico, * significa 0 o más veces). Además, los paréntesis se usan para recordar la primera ocurrencia de caracteres numéricos.

Este patrón se encuentra en Open Chapter 4.3, paragraph 6 y 4 es recordado. El patrón no se encuentra en Chapter 3 y 4, porque esta cadena no tiene un . despues del 3.

Para coincidir una subcadena sin que la parte coincidente se recuerde, en los paréntesis comience el patrón con ?:. Por ejemplo, (?:d+) coincide con uno o más caracteres numéricos, pero no recuerda los caracteres coincidentes.

Más información

Otros artículos de esta serie:

[seriesposts show_date=0 order=asc]

Publicar un Comentario

Si es la primera vez que escribes, tu comentario será moderado por un administrador.

Con el fin de garantizar un ambiente de debate respetuoso, no se permitirán comentarios:

  • insultantes, difamatorios, racistas, sexistas, y/o discriminatorios
  • excesivamente críticos con otros participanes
  • que no aporten nada, sin sentido o repetidos
  • con enlaces considerados publicidad o spam
  • con material protegido por derechos de autor
*
*