Expresiones regulares

Las expresiones regulares permiten la búsqueda de patrones complejos dentro de una cadena. Existen diversas maneras de definirlos en distintos lenguajes pero las bases son las mismas en todos. Gracias a Dios, en esta ocasión tanto Netscape como Microsoft incorporaron lo mismo en sus navegadores versión 4, basándose en la implementación de Perl. Vamos a explicarlo poco a poco y con ejemplos para no perderse porque es dificilillo:

/pepe/

Al aplicar este patrón en una búsqueda, devolverá verdadero si la cadena contiene pepe. En la jerga, esto significa que el patrón se "ajusta" a la cadena. El de arriba es el patrón más sencillo de todos, claro. Poco útil, ya que para esto se pueden utilizar las funciones de cadenas ya estudiadas. Los patrones pueden, tambien, dividirse en una o más ramas, separadas por el carácter "|". Un cadena se ajusta al patrón cuando contiene cualquiera de sus ramas.

/pepe|[hqw]/

En este caso, la cadena se ajustará si contiene a pepe o tiene cualquiera de los caracteres incluidos dentro de los corchetes. Los corchetes definen, por tanto, conjuntos de caracteres. Si se incluye dentro de ellos un guión podremos definir rangos de caracteres.

/[0-9]/

A este patrón se ajustarán todas las cadenas que se contengan dígitos. Si queremos incluir el guión dentro del conjunto de caracteres, podemos ponerlo al final del mismo ([0-9-]) o ponerlo detrás del carácter de escape (estos caracteres sirven para describir caracteres especiales), que en este caso será \, como en las cadenas normales (por tanto, el patrón sería /[\-0-9]/). En los casos más habituales de conjuntos podemos utilizar una de las siguientes clases de caracteres:

/\w/
Conjunto de caracteres alfanuméricos
/\d/
Conjunto de dígitos
/\s/
Conjunto de caracteres que definen espacios en blanco (el espacio, el tabulador y el retorno de carro).

Un conjunto de caracteres o un caracter normal puede ir seguido de un cuantificador que indique el número de veces que debe encontrarse dicho conjunto de forma consecutiva para que la cadena se ajuste al patrón.

/a+/
La cadena debe contener "a" al menos una vez.
/a*/
Cero o más veces.
/a?/
Cero o una vez.
/a{2}/
Dos veces.
/a{2,4}/
De dos a cuatro veces (inclusive).

Además existen otros caracteres especiales importantes (además del guión... y de las barras):

/./
Se ajusta a cualquier carácter.
/^/
Simboliza el comienzo de la cadena.
/$/
Simboliza el final de una cadena.

Estos dos últimos caracteres nos permiten comprobar que una cadena se ajuste exactamente al patrón, en lugar de comprobar si lo contiene. Así, por ejemplo, si queremos distinguir si una cadena que nos dan es una dirección web válida podríamos ver si se ajusta al siguiente patrón:

/^http[s]?://\w[\.\w]+$/

Es posible que estéis perplejos. No hay que preocuparse. Las expresiones regulares son muy difíciles. Ni yo ni nadie que conozca presume de controlarlas sin problemas. Las expresiones regulares son algo que te sale cuando estás inspirado y a veces ni aún así. A veces es más recomendable buscar en Internet a ver si alguien ha hecho antes la expresión que necesitas.

Por último, debemos definir los modificadores. Estos se incluyen al final del todo, después de la última barra:

/patron/i
Trata igual a mayúsculas y minúsculas. Por tanto, se ajustará a patron, o a PaTROn.
/patron/g
No para cuando encuentra una coincidencia sino que sigue evaluando el resto de la cadena. Es útil cuando no queremos buscar sino reemplazar.

Se pueden poner los dos, pero deberemos poner la g antes de la i.

 

Objeto RegExp

Vamos a ver por fin cómo utilizamos en el mundo real las expresiones regulares. Hay dos maneras más o menos equivalentes:

var reg = /^http[s]?://\w[\.\w]+$/i

O declarando explícitamente el objeto:

var reg = new RegExp("^http[s]?://\w[\.\w]+$", "i"); 
             

Métodos de String

Casi siempre utilizaremos los métodos de String para efectuar búsquedas y reemplazos. Los métodos más interesantes son:

cadena.search(regexp)
Devuelve verdadero si la cadena se ajusta a la expresión regular.
 
cadena.replace(regexp, reemplazo)
Devuelve una cadena que es la original en la que se han reemplazado las ocurrencias del patrón. La cadena por la que se reemplaza debe estar incluida en el mismo patrón de la siguiente forma:
replace(/Un Dos/gi, "Hola")

Este patrón reemplaza todas las ocurrencias de Un Dos por Hola. Se pueden utilizar paréntesis para poder emplear partes del patrón en el reemplazo:

replace(/(Un) (Dos)/gi, "$2 $1")

En este caso reemplarará todas las ocurrencias de Un Dos por Dos Un. Es decir, a lo contenido en el primer paréntesis le corresponde $1 y así sucesivamente.

 
cadena.split(regexp)
Devuelve un vector, resultado de separar la cadena por los delimitadores indicados en la expresión regular. Si la cadena fuera 1,2,3,4,5 y la expresión regular /,/ el vector tendría cinco elementos con cada uno de los cinco números.