Está en la página 1de 16

EXPRESIONES REGULARES Regex, Regexp PYTHON

Las expresiones regulares, tambin llamadas regex o regexp, consisten en patrones que describen conjuntos de cadenas de caracteres.

Algo parecido sera escribir en la lnea de comandos de Windows

dir *.exe

*.exe sera una expresin regular que describira todas las cadenas de caracteres que empiezan con cualquier cosa seguida de .exe, es decir, todos los archivos exe.

El trabajo con expresiones regulares en Python se realiza mediante el mdulo re, que data de Python 1.5 y que proporciona una sintaxis para la creacin de patrones similar a la de Perl. En Python 1.6 el mdulo se reescribi para dotarlo de soporte de cadenas unicode y mejorar su rendimiento.

El mdulo re contiene funciones para buscar patrones dentro de una cadena (search), comprobar si una cadena se ajusta a un determinado criterio descrito mediante un patrn (match), dividir la cadena usando las ocurrencias del patrn como puntos de ruptura ( split) o para sustituir todas las ocurrencias del patrn por otra cadena (sub). Veremos estas funciones y alguna ms en la prxima seccin, pero por ahora, aprendamos algo ms sobre la sintaxis de las expresiones regulares.

EXPRESIONES REGULARES: PATRONES


La expresin regular ms sencilla consiste en una cadena simple, que describe un conjunto compuesto tan solo por esa misma cadena. Por ejemplo, veamos cmo la cadena python coincide con la expresin regular python usando la funcin match:

import re

if re.match("python", "python"):

print "cierto"

Si quisiramos comprobar si la cadena es python, jython, cython o cualquier otra cosa que termine en ython, podramos utilizar el carcter comodn, el punto .:

re.match(".ython", "python") re.match(".ython", "jython")

La expresin regular .ython describira a todas las cadenas que consistan en un carcter cualquiera, menos el de nueva lnea, seguido de ython. Un carcter cualquiera y solo uno. No cero, ni dos, ni tres.

En el caso de que necesitramos el carcter . en la expresin regular, o cualqu ier otro de los caracteres especiales que veremos a continuacin, tendramos que escaparlo utilizando la barra invertida.

Para comprobar si la cadena consiste en 3 caracteres seguidos de un punto, por ejemplo, podramos utilizar lo siguiente:

re.match("...\.", "abc.")

Si necesitramos una expresin que slo resultara cierta para las cadenas python, jython y cython y ninguna otra, podramos utilizar el carcter | para expresar alternativa escribiendo los tres subpatrones completos:

re.match("python|jython|cython", "python")

o bien tan solo la parte que pueda cambiar, encerrada entre parntesis, formando lo que se conoce como un grupo. Los grupos tienen una gran importancia a la hora de trabajar con expresiones regulares y este no es su nico uso, como veremos en la siguiente seccin.

re.match("(p|j|c)ython", "python")

Otra opcin consistira en encerrar los caracteres p, j y c entre corchetes para formar una clase de caracteres, indicando que en esa posicin puede colocarse cualquiera de los caracteres de la clase.

re.match("[pjc]ython", "python")

Y si quisiramos comprobar si la cadena es python0, python1, python2, , python9? En lugar de tener que encerrar los 10 dgitos dentro de los corchetes podemos utilizar el guin, que sirve para indicar rangos. Por ejemplo a-d indicara todas las letras minsculas de la a a la d; 0 -9 seran todos los nmeros de 0 a 9 inclusive.

re.match("python[0-9]", "python0")

Si quisiramos, por ejemplo, que el ltimo carcter fuera o un dgito o una letra simplemente se escribiran dentro de los corchetes todos los criterios, uno detras de otro.

re.match("python[0-9a-zA-Z]", "pythonp")

Es necesario advertir que dentro de las clases de caracteres los caracteres especiales no necesitan ser escapados. Para comprobar si la cadena es python. o python,, entonces, escribiramos:

re.match("python[.,]", "python.")

y no

re.match("python[\.,]", "python.")

ya que en este ltimo caso estaramos comprobando si la cadena es python., python, o python\.

Los conjuntos de caracteres tambin se pueden negar utilizando el smbolo ^. La expresin python[^0-9a-z], por ejemplo, indicara que nos interesan las cadenas que comiencen por python y tengan como ltimo carcter algo que no sea ni una letra minscula ni un nmero.

re.match("python[^0-9a-z]", "python+")

El uso de [0-9] para referirse a un dgito no es muy comn, ya que, al ser la comprobacin de que un carcter es un dgito algo muy utilizado, existe una secuencia especial equivalente: \d. Existen otras secuencias disponibles que listamos a continuacin:

\d
un dgito. Equivale a [0-9]

\D
cualquier carcter que no sea un dgito. Equivale a [^0-9]

\w
Cualquier caracter alfanumrico. Equivale a [a-zA-Z0-9_].

\W
Cualquier carcter no alfanumrico. Equivale a [^a-zA-Z0-9_].

\s
Cualquier carcter en blanco. Equivale a [ \t\n\r\f\v]

\S
Cualquier carcter que no sea un espacio en blanco. Equivale a [^ \t\n\r\f\v]

Veamos ahora cmo representar repeticiones de caracteres, dado que no sera de mucha utilidad tener que, por ejemplo, escribir una expresin regular con 30 caracteres \d para buscar nmeros de 30 dgitos. Para este menester tenemos los caracteres especiales +, *, ?, adems de las llaves {}.

El carcter + indica que lo que tenemos a la izquierda, sea un carcter como a, una clase como [abc] o un subpatrn como (abc), puede encontrarse una o mas veces. Por ejemplo la

expresin regular python+ describira las cadenas python, pythonn, pythonnn, pero no pytho, ya que debe haber al menos una n.

El carcter * es similar a +, pero en este caso lo que se sita a su izquierda puede encontrarse cero o mas veces.

El carcter ? indica opcionalidad, es decir, lo que tenemos a la izquierda puede o no aparecer (puede aparecer 0 o 1 veces).

Finalmente las llaves sirven para indicar el nmero de veces exacto que puede aparecer el carcter de la izquierda, o bien un rango de veces que puede aparecer. Por ejemplo {3} indicara que tiene que aparecer exactamente 3 veces, {3,8} indicara que tiene que aparecer de 3 a 8 veces, {,8} de 0 a 8 veces y {3,} tres veces o mas (las que sean).

Otro elemento interesante en las expresiones regulares, para terminar, es la especificacin de las posiciones en que se tiene que encontrar la cadena, esa es la utilidad de ^ y $, que indican que el elemento sobre el que acta debe ir al principio de la cadena o al final de esta.

La cadena http://mundogeek.net, por ejemplo, se ajustara a la expresin regular ^http, mientras que la cadena El protocolo es http no lo hara, ya que el http no se encuentra al principio de la cadena.

EXPRESIONES REGULARES: USANDO EL MDULO RE


Ya hemos visto por encima cmo se utiliza la funcin match del mdulo re para comprobar si una cadena se ajusta a un determinado patrn. El primer parmetro de la funcin es la expresin regular, el segundo, la cadena a comprobar y existe un tercer parmetro opcional que contiene distintos flags que se pueden utilizar para modificar el comportamiento de las expresiones regulares.

Algunos ejemplos de flags del mdulo re son re.IGNORECASE, que hace que no se tenga en cuenta si las letras son maysculas o minsculas o re.VERBOSE, que hace que se ignoren los espacios y los comentarios en la cadena que representa la expresin regular.

El valor de retorno de la funcin ser None en caso de que la cadena no se ajuste al patrn o un objeto de tipo MatchObject en caso contrario. Este objeto MatchObjectcuenta con

mtodos start y end que devuelven la posicin en la que comienza y finaliza la subcadena reconocida y mtodos group y groups que permiten acceder a los grupos que propiciaron el reconocimiento de la cadena.

Al llamar al mtodo group sin parmetros se nos devuelve el grupo 0 de la cadena reconocida. El grupo 0 es la subcadena reconocida por la expresin regular al completo, aunque no existan parntesis que delimiten el grupo.

>>> mo = re.match(http://.+\net, http://mundogeek.net) >>> print mo.group()

http://mundogeek.net

Podramos crear grupos utilizando los parntesis, como aprendimos en la seccin anterior, obteniendo as la parte de la cadena que nos interese.

>>> mo = re.match(http://(.+)\net, http://mundogeek.net) >>> print mo.group(0)

http://mundogeek.net

>>> mundogeek

print

mo.group(1)

El mtodo groups, por su parte, devuelve una lista con todos los grupos, exceptuando el grupo 0, que se omite.

>>> mo = re.match(http://(.+)\(.{3}), http://mundogeek.net) >>> print mo.groups() (mundogeek, net)

La funcin search del mdulo re funciona de forma similar a match; contamos con los mismos parmetros y el mismo valor de retorno. La nica diferencia es que al utilizar match la cadena

debe

ajustarse

al

patrn

desde

el

primer

carcter

de

la

cadena,

mientras

que

con search buscamos cualquier parte de la cadena que se ajuste al patrn. Por esta razn el mtodo start de la funcin match siempre devolver 0, mientras que en el caso

de search esto no tiene por qu ser as.

Otra funcin de bsqueda del mdulo re es findall. Este toma los mismos parmetros que las dos funciones anteriores, pero devuelve una lista con las subcadenas que cumplieron el patrn.

Otra posibilidad, si no queremos todas las coincidencias, es utilizar finditer, que devuelve un iterador con el que consultar uno a uno los distintos MatchObject.

Las expresiones regulares no solo permiten realizar bsquedas o comprobaciones, sino que, como comentamos anteriormente, tambin tenemos funciones disponibles para dividir la cadena o realizar reemplazos.

La funcin split sin ir ms lejos toma como parmetros un patrn, una cadena y un entero opcional indicando el nmero mximo de elementos en los que queremos dividir la cadena, y utiliza el patrn a modo de puntos de separacin para la cadena, devolviendo una lista con las subcadenas.

La funcin sub toma como parmetros un patrn a sustituir, una cadena que usar como reemplazo cada vez que encontremos el patrn, la cadena sobre la que realizar las sustituciones, y un entero opcional indicando el nmero mximo de sustituciones que queremos realizar.

Al llamar a estos mtodos lo que ocurre en realidad es que se crea un nuevo objeto de tipo RegexObject que representa la expresin regular, y se llama a mtodos de este objeto que tienen los mismos nombres que las funciones del mdulo.

Si vamos a utilizar un mismo patrn varias veces nos puede interesar crear un objeto de este tipo y llamar a sus mtodos nosotros mismos; de esta forma evitamos que el intrprete tenga que crear un nuevo objeto cada vez que usemos el patrn y mejoraremos el rendimiento de la aplicacin.

Para crear un objeto RegexObject se utiliza la funcin compile del mdulo, al que se le pasa como parmetro la cadena que representa el patrn que queremos utilizar para nuestra expresin regular y, opcionalmente, una serie de flags de entre los que comentamos anteriormente.

JAVA
Las expresiones regulares son algo que se usa desde hace aos en otros lenguajes de programacin como Perl, Sed o Awk. En la versin 1.4 del JDK de Sun se incluye el paquete java.util.regex, que proporciona una serie de clases para poder hacer uso de la potencia de este tipo de expresiones en Java. Antes de nada necesitamos saber qu es una expresin regular y para que nos puede servir: Pues bien, una expresin regular es un patrn que describe a una cadena de caracteres. Todos hemos utilizado alguna vez la expresin *.doc para buscar todos los documentos en algn lugar de nuestro disco duro, pues bien, *.doc es un ejemplo de una expresin regular que representa a todos los archivos con extensin doc, el asterisco significa cualquier secuencia de caracteres (vale, los que ya conozcan esto dirn que no es correcto, y dirn bien, es mas preciso hablar de *.doc pero el ejemplo es muy grfico). Las expresiones regulares se rigen por una serie de normas y hay una construccin para cualquier patrn de caracteres. Una expresin regular slo puede contener (aparte de letras y nmeros) los siguientes caracteres: < $, ^, ., *, +, ?, [, ], . >

Una expresin regular, nos servir para buscar patrones en una cadena de texto, por ejemplo encontrar cuantas veces se repite una palabra en un texto, para comprobar que una cadena tiene una detereminada estructura, por ejemplo que el nombre de archivo que nos proponen tiene una determinada extensin, o comprobar que un email esta bien escrito... Para cada uno de estos casos existe una expresin regular que los representa: Por medio de la expresin regular "camion" podemos encontrar cuantas veces se repite camin en un texto. Es la construccin mas sencilla. Esta expresin "^www.*.es" comprueba que una cadena sea una direccin web que comience por www y sea de un servidor espaol. Y esta, para ver la potencia de las expresiones regulares, comprueba la buena formacin de los correos electrnicos: "[^A-Za-z0-9.@_-~#]+". [Para ver como formar expresiones regulares puede ir al Apndice A]

Uso
El paquete java.util.regex esta formado por dos clases, la clase Matcher y la clasePattern y por una excepcin, PatternSyntaxException. La clase Pattern (segun la documentacion del jdk1.4) es la representacion compilada de una expresion regular, o lo que es lo mismo, representa a la expresion regular, que en el paquetejava.util.regex necesita estar compilada. En castellano significa patrn. La clase Matcher es un tipo de objeto que se crea a partir de un patrn mediante la invocacin del mtodo Pattern.matcher. Este objeto es el que nos permite realizar operaciones sobre la secuencia de caracteres que queremos validar o la en la secuencia de caracteres en la que queremos buscar. En castellano lo mas parecido a esto es la palabra encajador. Por lo tanto tenemos patrones que deben ser compilados, a partir de estos creamos objetosMatcher (encajadores) para poder realizar las operaciones sobre la cadena en cuestin. Vamos con la clase Pattern, para crear un patrn necesitamos compilar una expresin regular, esto lo conseguimos con el mtodo compile:

Pattern patron = Pattern.compile("camion"); El mtodo pattern devuelve la expresin regular que hemos compilado, el mtodo matchercrea un objeto Matcher a partir del patrn, el mtodo split divide una cadena dada en partes que cumplan el

patrn compilado y por ltimo el mtodo matches compila una expresin regular y comprueba una cadena de caracteres contra ella. Ahora la clase Matcher. Esta clase se utiliza para comprobar cadenas contra el patrn indicado. Un objeto Matcher se genera a partir de un objeto Pattern por medio del mtodo matcher: Pattern patron = Pattern.compile("camion"); Matcher encaja = patron.matcher(); Una vez que tenemos el objeto creado, podemos realizar tres tipos de operaciones sobre una cadena de caracteres. Una es a travs del mtodo matches que intenta encajar toda la secuencia en el patrn (para el patrn "camion" la cadena "camion" encajara, la cadena "mi camion es verde" no encajara). Otra es a travs del mtodo lookingAt, intenta encajar el patrn en la cadena (para el patrn "camion" tanto la cadena "camion" como la cadena "mi camion es verde" encajaria). Otra es la proporcionada por el mtodo find que va buscando subcadenas dentro de la cadena de caracteres que cumplan el patrn compilado (una vez encontrada una ocurrencia, se puede inspeccionar por medio de los mtodos start que marca el primer carcter de la ocurrencia en la secuencia y el mtodo end que marca el ultimo carcter de la ocurrencia). Todos estos mtodos devuelven un booleano que indica si la operacin ha tenido xito. Todo lo anterior esta orientado a la b6uacutesqueda de patrones en cadenas de caracteres, pero puede que queramos llegar mas all, que lo que queramos sea reemplazar una cadena de caracteres que se corresponda con un patrn por otra cadena. Por ejemplo un mtodo que consigue esto es replaceAll que reemplaza toda ocurrencia del patrn en la cadena por la cadena que se le suministra.

Ejemplos
El siguiente es un ejemplo del uso del mtodo replaceAll sobre una cadena. El ejemplo sustituye todas las apariciones que concuerden con el patron "a*b" por la cadena "-". // se importa el paquete java.util.regex import java.util.regex.*; public class EjemploReplaceAll{ public static void main(String args[]){ // compilamos el patron Pattern patron = Pattern.compile("a*b"); // creamos el Matcher a partir del patron, la cadena como parametro Matcher encaja = patron.matcher("aabmanoloaabmanoloabmanolob"); // invocamos el metodo replaceAll String resultado = encaja.replaceAll("-"); System.out.println(resultado); } } El siguiente ejemplo trata de validar una cadena que supuestamente contiene un email, lo hace con cuatro comprobaciones, con un patrn cada una, la primera que no contenga como primer caracter una @ o un punto, la segunda que no comience por www. , que contenga una y solo una @ y la cuarta que no contenga caracteres ilegales: import java.util.regex.*; public class ValidacionEmail { public static void main(String[] args) throws Exception { String input = "www.?regular.com"; // comprueba que no empieze por punto o @ Pattern p = Pattern.compile("^.|^@"); Matcher m = p.matcher(input); if (m.find()) System.err.println("Las direcciones email no empiezan por punto o @"); // comprueba que no empieze por www. p = Pattern.compile("^www."); m = p.matcher(input); if (m.find()) System.out.println("Los emails no empiezan por www"); // comprueba que contenga @

p = Pattern.compile("@"); m = p.matcher(input); if (!m.find()) System.out.println("La cadena no tiene arroba"); // comprueba que no contenga caracteres prohibidos p = Pattern.compile("[^A-Za-z0-9.@_-~#]+"); m = p.matcher(input); StringBuffer sb = new StringBuffer(); boolean resultado = m.find(); boolean caracteresIlegales = false; while(resultado) { caracteresIlegales = true; m.appendReplacement(sb, ""); resultado = m.find(); } // Aade el ultimo segmento de la entrada a la cadena m.appendTail(sb); input = sb.toString(); if (caracteresIlegales) { System.out.println("La cadena contiene caracteres ilegales"); } } }

Conclusin
Las expresiones regulares vienen a tapar un hueco en el JDK de Sun que venia siendo solicitado desde hace mucho tiempo. Con la inclusin de las expresiones regulares Java se convierte, en este tema, en un lenguaje de programacin tan flexible como otros mas tradicionales en el tema de las expresiones regulares, Perl, Awk, etc... Hasta ahora la unica opcin para conseguir un efecto parecido era el uso de StringTokenizer en conjuncin con llamadas repetidas al mtodo charAt que produca un cdigo demasiado enrevesado. Las expresiones regulares tienen un amplio abanico de posibilidades, principalmente para hacer bsquedas, para sustituir ocurrencias y para comprobar la buena formacin de cadenas, como se ha visto en el ejemplo del email.

Enlaces
Java Developers Kit de Sun v.1.4: http://java.sun.com/j2se/ Documentacion de Sun del paquete java.util.regex:http://java.sun.com/j2se/1.4/docs/api/java/util/regex/package-summary.html Tutorial de expresiones regulares: http://bulmalug.net/body.phtml?nIdNoticia=770

Apndice A
Lo que viene a continuacin no es mas que la traduccin del la documentacin de una parte de la clase Pattern. Para una referencia completa puede consultar la versin en ingles de Sun inc. sobre la clase Pattern enhttp://java.sun.com/j2se/1.4/docs/api/java/util/regex/Pattern.html. Expresion Encaja con Caracteres x El caracter x El caracter n El caracter con valor octal 0n (0 <= n <= 7) nn El caracter con valor octal 0nn (0 <= n <= 7) mnn El caracter con valor octal 0mnn (0 <= m <= 3, 0 <= n<= 7) xhh El caracter con valor hexadecimal 0xhh

uhhhh

f a e cx Intervalos de caracteres [abc] [^abc] [a-zA-Z] [a-d[m-p]] [a-z&&[def]] [a-z&&[^bc]] [a-z&&[^m-p]] Intervalos de caracteres predefinidos . d D s S w W Intervalos de caracteres POSIX (solo para US-ASCII) {lower} {upper} {alpha} {digit} {alnum} {punct} {graph} {print} {blank} {cntrl} {xdigit} {space} Limites ^ $ B A G

El caracter con valor hexadecimal 0xhhhh El tabulador ('u0009') Nueva linea (line feed) ('u000A') Retorno de carro ('u000D') Nueva pagina ('u000C') Un beep de alerta (bell) ('u0007') Escape ('u001B') El caracter de control que corresponde a x a, b, o c Cualquier caracter excepto a, b, o c (negacion) Desde la a a la z o desde la A hasta la Z, incluidos Desde la a hasta la d, o desde la m a la p: [a-dm-p] (union) La d, la e, o la f (interseccion) Desde la a hasta la z, excepto la b y la c: [ad-z] (resta) Desde la a hasta la z, excepto desde la m hasta la p: [a-lqz](resta)

Cualquier caracter (puede que no se incluyan losterminadores de linea) Un numero: [0-9] Todo menos un numero: [^0-9] Un espacio en blanco: [ x0Bf ] Todo menos un espacio en blanco: [^s] Una letra: [a-zA-Z_0-9] Todo menos letras: [^w]

Letras minusculas: [a-z] Letras mayusculas:[A-Z] Letras:[{lower}{upper}] Numero decimal: [0-9] Caracter alfanumerico:[{alpha}{digit}] Signos de puntuacion: uno ./:;<=>?@[]^_`{|}~ Los caracteres visibles: [{alnum}{punct}] Los caracteres imprimibles: [ {graph}] Un espacio o un tabulador: [ ] Un caracter de control: [x00-x1Fx7F] Un numero hexadecimal: [0-9a-fA-F] Un espacio: [ x0Bf ]

de !"#$%&'()*+,-

Comienzo de una linea Fin de una linea Fin de palabra No es fin de palabra El principio de la cadena de entrada El final del ultimo patron encajado El final de la entrada pero el terminador final, si existe

z Cuantificadores de cantidad X? X* X+ X { n} X(n,} X{n,m} Operadores logicos XY X |Y (X) Referencias hacia atras

El final de la cadena de entrada X, X, X, X, X, X, una o ninguna vez cero o ninguna vez una o mas veces exactamente n veces por lo menos n veces por lo menos n veces pero no mas de m veces

X seguido de Y XoY X, como un grupo Lo que haya encajado el nesimo grupo

, Escape, y entrecomillado
El caracter () sirve para preceder a expresiones con valores de escape tal y como se define en la tabla anterior, asi como para entrecomillar caracteres que de otra manera serian interpretados como caracteres de escape. De este modo la expresion representa a un unico y { representa a una llave. Es un error usar un antes de cualquier caracter alfabetico que no corresponda a un caracter de escape, este tipo de construcciones se reservan para extensiones de futuras versiones del lenguaje de expresiones regulares. El caracter puede ser usado antes de un caracter no alfabetico a pesar de que el caracter sea parte de una expresion que no sea de escape.

Terminadores de linea
Un terminador de linea es una secuencia de uno o dos caracteres que indica el final de una linea de la secuencia de caracteres de entrada. Los siguientes son terminadores de linea: El caracter de Nueva linea (line feed) (' '), El caracter de retorno de carro seguido de una nueva linea (" "), El caracter de retorno de carro unicamente (' '), El caracter de nueva linea ('u0085'), El caracter de separacin de linea ('u2028'), o El caracter de separacion de parrafos ('u2029). Si el modo UNIX_LINES esta activado entonces los unicos terminadores de linea reconocidos seran caracteres de nueva linea. La expresion regular . Representa a cualquier caracter excepto un terminador de linea a no ser que el modo DOTALL sea especificado.

Grupos
Los grupos se numeran contando los parentesis abiertos de izquierda a derecha. En la expresion ((A)(B(C))), por ejemplo, hay cuatro de estos grupos: 1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) El grupo cero siempre es la expresion completa.

C
Que es una expresion regular: Una expresion regular es un conjunto de caracteres y metacaracteres que definen reglas sintacticas para la evaluacin de una cadena de texto. Esto es, podemos definir la forma que debe tomar una cadena ya sea simplemente para validar o hacer esta cadena contra nuestra Expresion Regular.

Contenido 1 Caracteres-Metacaracteres Los caracteres ya los conocemos, los metacaracteres son caracteres especiales que tienen significados especiales. Por ejemplo: cuando escribimos ordenes en el ordenador *.cs Lo que estamos haciendo es buscar todos los archivos con extensin cs (codigo de C Sharp). Debemos notar que el asterisco se reemplaza por "cualquier cosa" por lo tanto este es un metacaracter ya que no significa lo que realmente significa . El cdigo: ^ Excluye los caracteres. s Coincide con el caracter de espacio [A-Z] Coincidira con cualquier caracter dentro del grupo { n} La expresio coincide si se encuentra como minimo n veces. d Coincide con cualquier caracter de digito w Coincide con cualquier caracter de palabra(incluidos los numeros).

A continuacin sigue cdigo en C# (C Sharp):

private void txtrfc_Leave(object sender, System.EventArgs e) { //El Registro Federal de Causantes (RFC) JRH 9210065M1 // Si quieres que acepte mayuscula y minuscula [a-zA-Z] if(Regex.IsMatch(this.txtrfc.Text,@"^([A-Zs]{4})d{6}([A-Zw]{3})$" { MessageBox.Show("RFC valido" this.txtNombre.Focus(); } ; )

else { MessageBox.Show("Teclee un RFC valido","ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Espacios de nombres usados en el cdigo: System.Text.RegularExpressions

LINUX Una expresin regular es un patrn que nos permite buscar un texto formado por metacaracteres y caracteres ordinarios. Los metacaracteres son ciertos caracteres con un significado especfico dentro de una expresin regular. Estos caracteres tienen un significado que va ms all del smbolo que representan y tienen un comportamiento especial en una expresin regular. Aqu tenis una lista de metacaracteres que usamos en expresiones regulares: . Significa cualquier caracter. ^Indica el principio de una lnea. $ Indica el final de una lnea. * Indica cero o ms repeticiones del caracter anterior. + Indica una o ms repeticiones del caracter anterior. \< Indica el comienzo de una palabra. \> Indica el final de una palabra. \ Caracter de escape. Da significado literal a un metacaracter. [ ] Uno cualquiera de los caracteres entre los corchetes. Ej: [A-Z] (desde A hasta Z). [^ ] Cualquier caracter distinto de los que figuran entre corchetes: Ej: [^A-Z]. { } Nos permiten indicar el nmero de repeticiones del patrn anterior que deben darse. | Nos permite indicar caracteres alternativos: Ej: (^|[?&])

( ) Nos permiten agrupar patrones. Ej: ([0-9A-F]+:)+ Ojo. En las expresiones regulares se distingue entre maysculas y minsculas. Si queremos representar un caracter entre la a y la z, lo haremos de la siguiente manera: [a-z] Dentro del conjunto, podemos especificar todos los caracteres que queramos. Por ejemplo: [a-zAZ] representara los caracteres alfabticos en minsculas y maysculas. Eso s. El conjunto representa a un slo caracter. Si lo que queremos es representar identificar un nmero o una letra, podramos hacerlo as: [a-zA-Z0-9]

Los conjuntos pueden representarse, nombrando todos y cada uno de los elementos, o el intervalo. Ej: [0-9] representa lo mismo que [0123456789]. Si queremos representar un nmero que se compone de cero o ms dgitos: [0-9]* Y si queremos representar un nmero que se compone de uno o ms dgitos: [0-9]+ Si ahora queremos representar cualquier caracter menos los dgitos: [^0-9] Ahora, imaginemos que queremos representar un nmero de 5 dgitos: [0-9]{5} Y si quisieramos representar una palabra que tiene entre dos y cuatro caracteres: [a-zA-Z]{2,4} Dentro de los conjuntos de caracteres individuales, se reconocen las siguientes categoras: [:alnum:] alfanumricos [:alpha:] alfabticos [:cntrl:] de control [:digit:] dgitos [:graph:] grficos [:lower:] minsculas [:print:] imprimibles [:punct:] de puntuacin [:space:] espacios [:upper:] maysculas [:xdigit:] dgitos hexadecimales Vamos a ver algunos ejemplos de expresiones regulares:
# grep '^La' fichero

El comando anterior nos devuelve todas las lneas del fichero que comienzan por La.
# grep '^ *La' fichero

El comando anterior nos devuelve todas las lneas del fichero que comienzan por cualquier nmero de espacios seguido de La.
# grep '^\..*' fichero

El comando anterior nos devuelve todas las lneas del fichero que comienzan por punto y tienen cualquier nmero de caracteres.
# ls -la | grep ' \..*'

El comando anterior nos devuelve la lista de ficheros que comienzan por un espacio seguido de un punto y cualquier nmero de caracteres, es decir, la lista de ficheros ocultos.
# ls -l | grep '^d'

El comando anterior nos devuelve la lista de ficheros que comienzan por d, es decir, la lista de directorios. rm * eliminar todos los ficheros de la carpeta actual

mv *hoy* directorio trasladar todos los ficheros cuyo nombre contenga las letras hoy touch ficha[!0] Cambiar la fecha de todos los archivos ficha? Excepto aquel que acaba en 0 cat arch? Imprimir en la pantalla todos los ficheros cuyo nombre sea arch seguido de un caractacter ls a[1-3] Listar los archivos a1 a2 y a3 cp [a-c]-{mio,tuyo} carpeta Copiar los archivos a-mio, a-tuyo, b-mio, b-tuyo, c-mio, c-tuyo,