Está en la página 1de 7

Las expresiones regulares son una potente herramienta que nos permite contrastar un texto con un patrn de bsqueda.

Esta tarea resulta fundamental en algunos programas, y en otros puede facilitarnos increblemente el trabajo. PHP permite dos tipos principales de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg (Compatibles con Perl). Son muy similares, anque las segundas llegan a ser algo ms potentes. Una expresin regular, consiste en comparar un patrn frente a un texto, para comprobar si el texto contiene lo especificado en el patrn. Por poner un par de ejemplos: Patrn: in Coindicen: intensidad cinta interior Patrn: [mp]adre Coindicen: Mi madre se llama Luisa Tu padre es jardinero A continuacin voy a repasar la sintaxis bsica de una expresin regular Sintaxis y metacaracteres El punto El punto representa cualquier caracter. Escribiendo un punto en un patrn querrs decir que ah hay un caracter, cualquiera. Desde la A a la Z (en minscula y mayscula), del 0 al 9, o algn otro smbolo. Ejemplos: ca.a coincide con cana, cama, casa, caja, etc No coincide con casta ni caa Principio y fin de cadena Si queremos indicar al patrn qu es el principio de la cadena o qu es el final, debemos hacerlo con ^ para inicio y $ para final. Ejemplos: ^olivas coincide con olivas verdes, pero no con quiero olivas Cuantificadores Para indicar que cierto elemento del patrn va a repetirse un nmero indeterminado de veces, usaremos + o * . Usando + queremos decir que el elemento anterior aparece una o ms veces. Usando * queremos decir que el elemento anterior aparece cero o ms veces. Ejemplos: gafas+ coincide con gafassss pero no con gafa sin embargo clo*aca coincide con claca, cloaca, cloooooooaca, etc.. Si lo que queremos indicar al patrn es que un elemento puede que est (una vez) o puede que no, lo haremos con el interrogante de la siguiente forma: coches? coincide con coche y con coches Para definir la cantidad de veces que va a repetirse el elemento, tendremos que hacer uso de las llaves: { }, indicando en su interior el intervalo, o la cantidad exacta de veces que va a repetirse.

Ejemplos: abc{4} coincide con abcccc, pero no con abc ni abcc, etc abc{1,3} coincide con abc, abcc, abccc, pero no con abcccc Si un parmetro queda vaco, significa un nmero indeterminado. Por ejemplo: x{5,} significa que la x ha de repetirse 5 veces, o ms. Rangos Los corchetes [] incluidos en un patrn permiten especificar el rango de caracteres vlidos a comparar. Basta que exista cualquiera de ellos para que se de la condicin. Dentro de ellos pondremos cualquier cantidad de caracteres, uno a continuacin del otro; o un rango del abecedario o de los nmeros enteros del 0 al 9. Ejemplos: c[ao]sa coincide con casa y con cosa [a-f] coincide con todos los caracteres alfabticos de la a a la f [0-9][2-6][ANR] coincide con 12A, 35N, 84R, etc.. pero no con 21A, ni 33L, ni 3A, etc Dentro de los corchetes, hay que tener en cuenta que el smbolo ^ ya no significa inicio, sin que es un negador, es decir: [^a-Z] coincidir con cualquier texto que NO tenga ningn caracter alfabtico (ni minsculas ni maysculas), y ^@ coincide con cualquier caracter excepto @ y espacio Alternancia Para alternar entre varias opciones, usaremos el smbolo | (barra vertical, en los teclados suele ser Alt Gr + 1). Con este mecanismo haremos un disyuntor, que nos permitir dar varias opciones. Si una de ellas coincide, el patrn ser cierto. Ejemplos: aleman(ia|es) coincide con alemania y con alemanes (norte|sur|este|oeste) coincide con cualquiera de los puntos cardinales. Agrupadores Los parntesis nos sirven para agrupar un subconjunto. Como hemos visto en el ejemplo anterior, nos es til para definir la alternancia, pero agrupar un subpatrn nos permite trabajar con l como si fuera un nico elemento. Ejemplos: (abc)+ coincide con abc, abcabc, abcabcabc, etc ca(sca)?da coincide con cascada y con cada Escapar caracteres Si por ejemplo quisiramos que en el patrn hubiese un punto, o un smbolo asterisco, sin que se interprete como metacaracter, tendremos que escaparlo. Esto se hace poniendo una barra invertida justo antes: \. o \* Esto puede hacerse con cualquier caracter que quieras introducir de forma literal, y no interpretada.

Las funciones Una vez tenemos clara la sintaxis, nos pondremos manos a la obra con el cdigo. En este caso usaremos las funciones que nos proporciona PHP, anque la sintaxis es comn a muchos lenguajes. Funciones tipo POSIX Existen seis funciones de este tipo, que son las siguientes: ereg(). Devuelve true si se cumple el patrn, o false si no se cumple. eregi(). Igual que ereg(), pero sin distinguir maysculas y minsculas ereg_replace(). Usando la potencia de las expresiones regulares, permite modificar una cadena de texto. eregi_replace(). Igual que la anterior, sin distinguir minsculas y maysculas. split(). Divide una cadena en un array, segn un patrn REGEX. Hace la misma tarea que la funcin explode, pero indicando una expresin regular como separador. spliti(). Igual que el anterior, sin diferenciar minscula y mayscula.

Funciones tipo PCRE Estas funciones son un poco ms complejas, y consecuentemente ms potentes. La diferencia ms significativa en cuanto a sintaxis es que el patrn deber estar delimitado por dos caracteres. Usualmente se usan barras ( / ), aunque podemos usar cualquier smbolo, como ( # ), sobretodo en un patrn que contenga barras. Otra diferencia importante son los modificadores. preg_match(). Chequea el patrn en una cadena alfanumrica. Devuelve true si coincide, o false en caso contrario. Adems captura las coincidencias en un array. preg_match_all(). Igual que preg_match, pero almacenando todas las subcadenas que coincidan con el patrn (no slo una como es el caso de preg_match) preg_replace(). Nos permite reemplazar textos mediante expresiones regulares. Los argumentos pueden ser arrays, con lo que se realiza ms de una sustitucin con una sola funcin. preg_split(). Separa la cadena dada mediante una expresin regular. preg_grep(). Busca el patrn dentro de un array, y devuelve otro array con las ocurrencias.

Ejemplos prcticos A continuacin muestro algunos ejemplos de uso de estas funciones: Uso sencillo de preg_match. 1. <?php 2. // Este cdigo lee la variable $documento (HTML), y encuentra un numero en negrita 3. $documento = <h1>Numero</h1> <p>El numero es <strong>720</strong>, bla bla bla</p>; 4. preg_match("#<strong>([0-9]+)</strong>#is",$documento,$num); 5. $numero = $num[1]; 6. 7. echo $numero; // Devuelve 720 8. ?> Uso de la referencia hacia atrs en preg_match_all 1. <?php 2. // El \\2 es un ejemplo de referencia hacia atrs. Este le dice a pcre 3. // que debe buscar el segundo conjunto de parntesis en la expresin 4. // regular misma, que sera ([\w]+) en este caso. La barra invertida 5. // extra es requerida ya que la cadena se encuentra entre comillas 6. // dobles. 7. $html = "<b>texto en negrilla</b><a href=hola.html>haga clic aqu</a>"; 8. 9. preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $coincidencias, PREG_SET_ORDER); 10. 11. foreach ($coincidencias as $val) { 12. echo "coincidencia: " . $val[0] . "\n"; 13. echo "parte 1: " . $val[1] . "\n"; 14. echo "parte 2: " . $val[3] . "\n"; 15. echo "parte 3: " . $val[4] . "\n\n"; 16. } 17. ?> Simple comprobacin con el patrn de IP 1. <?php 2. // Funcion que comprueba si el dato pasado es una IP correcta 3. function ipValida($ip){ 4. if(!eregi("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$", $ip)) 5. return false; 6. 7. $tmp = explode(".", $ip);

8. 9. foreach($tmp as $sub){ 10. $sub = $sub * 1; 11. if($sub<0 || $sub>256) return false; 12. } 13. 14. return true; 15. } 16. ?>

Las expresiones regulares sirven para definir el vocabulario de un lenguaje. * es para repetir de 0, 1 o hasta n veces algo ejemplo a* sera el conjunto formado por la palabra vaca, a, aa, aaa, aaaa, etc. + es lo mismo pero de 1 a n (o sea, la palabra vaca no est incluida) ejemplo a+ sera el conjunto formado por a, aa, aaa, aaaa, etc. [abc] sera el conjunto {a,b,c} (o sea, esas letras, algo as como o "a" o "b" o "c") ejemplo el lenguaje [abc] tendra tres palabras: la palabra "a", la "b" y la "c" ejemplo el lenguaje formado por palabras que tengan letras a,b y c sera [abc]* --> abbbc, bababa, ccabcab, etc. [a-z] seria equivalente a poner [abcde...z] [a-zA-Z] seria equivalente a poner [abcde...zABCDEZ] ejemplo [a-zA-Z]* todas las palabras que no tengan numeros ni simbolos raros ^a es cualquier smbolo que no sea la a ejemplo ^[a-Az-Z] cualquier smbolo menos una letra . cualquier smbolo (el lenguaje ms grande que existe es entonces .*) a? es "palabra vaca" y "a" Meta caracteres Si quieres que tu lenguaje tenga corchetes has de usar la secuencia de escape "\" (el intro (\n), tabulador (\t), etc.) ejemplo [\[ab\]] es un lenguaje compuesto por [, a, b y ]}

Que necesitamos para usar expresiones regulares en Java ? En Java a partir del JDK 1.4 se nos proporciona el paquete java.util.regexp el cual est formado por dos clases, que explicar a continuacin, la clase Matcher y la clase Pattern . Las cuales incluiremos en nuestro programa de la siguiente manera: import java.util.regex.Matcher; import java.util.regex.Pattern; Algunos mtodos interesantes de la clase "Matcher": int end(int group) Devuelve el ndice del ltimo carcter ms 1 de la coincidente con la expresin regular. boolean find() Busca en la cadena de texto a analizar a partir del ltimo matching, la secuencia de caracteres que puede concordar con la expresin regular

boolean find(int start) Lo mismo que find() , pero empieza a buscar a partir de un ndice que le es dado como parmetro. String group() Devuelve la cadena que ha sido aceptada por la expresin regular. String group (int group) Es el equivalente en perl a $n. Es decir, si tenemos una expresin regular tal que : ((a)(b)(c)), group(2) sera a. Algunos mtodos interesantes de la clase "Pattern": static Pattern compile (String expreg) Crea un patrn a partir de la expresin regular dada por expreg.

static Pattern compile(String regex, int flags) Crea un patrn a partir de la expresin expreg teniendo en cuenta los flags. Los flags son opciones que se incluyen para tener un trato especial cuando se este trabajando con la expresin regular. Ejemplo: si quiero que no me distinga entre maysculas y minsculas, tendr que aadir el flag Pattern.CASE_INSENSITIVE.

int flags () Devuelve los flags asociados a la expresin regular o patrn. Matcher matcher(CharSequence input) Realizar el tratamiento del patrn sobre el texto que se le pase como entrada. static boolean matches(String regex, CharSequence input) La utilidad de este mtodo es que permite la no utilizacin de un matcher para indicar si una expresin regular puede albergar una cadena o parte de esta. String pattern() Devuelve la expresin regular asociada al objeto Pattern sobre el que estemos trabajando. String [] split (CharSequence input) Tiene el mismo significado que en Perl;es decir, dado un patrn, te crea un array de String con las diferentes cadenas en las que se ha dividido. El ejemplo import java.util.regex.Matcher; import java.util.regex.Pattern;

public class regexpjava { public static void main(String[] args) { Pattern pat=null; Matcher mat=null; String texto="<title>Hola soy el titulo</title>"; pat=Pattern.compile("<title>(.*?)</title>"); mat=pat.matcher(texto); System.out.println("Texto \t\t\t: "+texto); if(mat.find()){ System.out.println("Expresion regular \t: <title>(.*?)</title>"); System.out.println("Match! \t\t\t: "+mat.group(1)); } } } La salida sera la siguiente: Quote Texto : <title>Hola soy el titulo</title> Expresion regular : <title>(.*?)</title> Match! : Hola soy el titulo

También podría gustarte