Las expresiones regulares son una poderosa y estandarizada forma de buscar y reemplazar texto con complejos patrones de caracteres. A los que las han usado expresiones regulares (ER de ahora en adelante) en otros lenguajes (como Python), la sintaxis le parecerá muy similar. Este tutorial es para Actionscript 3, pero funciona para muchos otros lenguajes, como PHP o Perl.
Para ver como trabajan las ER (Expresiones Regulares) realizaremos una clase para verificar la correcta escritura de Números Romanos.
En los Números Romanos, hay 7 caracteres que son repetidos y combinados en varias formas para representar números:
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
- Los caracteres son aditivos. I es 1, II es 2, y III es 3. VI es 6 (literalmente, “5 y 1”), VII es 7 y VIII es 8.
- Los caracteres de la unidad y decenas (I, X, C y M) pueden repetirse hasta tres veces. Para el 4, debe restar del cinco inmediatamente superior. No puede representar 4 como IIII; en lugar de eso se representa con IV (“1 menos que 5”). El número 40 se escribe como XL (10 menos que 50), 41 como XLI, 42 como XLII, 43 como XLIII y 44 como XLIV (10 menos que 50, y 1 menos que 5).
- De forma similar, para el 9, debe restar de la decena inmediata: 8 es VIII, pero 9 es IX (1 menos que 10), no VIIII (ya que la I no se puede repetir cuatro veces). El número 90 es XC, 900 es CM.
- Los caracteres para "cinco" no se pueden repetir. El número 10 siempre se representa como X nunca como VV. El número 100 siempre es C nunca LL.
- Los números romanos siempre se escriben del mayor al menor y se leen de izquierda a derecha, de manera que el orden de los caracteres importa mucho. DC es 600; CD es un número completamente diferente (400, 100 menos que 500). CI es 101; IC no es siquiera un número romano válido (porque no puede restar 1 directamente de 100; tendrías que escribirlo como XCIX, que es 10 menos que 100 y 1 menos que 10).
Empecemos con la clase, crea un archivo .as y nómbralo Roman.as y coloca el siguiente código:
Código :
package clases{ public class Roman{ private var pattern:RegExp = /^M?M?M?$/; function Roman(){ //Constructor de la clase } public function ValidarRomano(romano:String):Boolean{ return pattern.test(romano); } } }La variable pattern es donde se almacenara el patrón de la ER, en ActionScript 3 hay dos formas de crear una expresión regular. La primera es colocando entre 2 slash el patrón a verificar, la otra forma seria instanciando la clase RegExp mendiante new:
Código :
pattern:RegExp = new RegExp("^M?M?M?$", "");
Seguidamente tenemos la función ValidarRomano(), alli usamos el método test() que devuelve true o false, si el String cumple o no el patrón.
Pongamos atención ahora en la variable pattern, vemos que comienza con el metacaracter ^, con esto le estamos diciendo a la ER que lo que sigue coincida sólo con el comienzo de la cadena. Tenemos M? para buscar la aparición de 0 ó una M. Se repite 3 veces que como ya vimos es la máxima cantidad de veces que dicho carácter puede repetirse, al final colocamos $ para que lo anterior preceda sólo al fin de la cadena. Cuando se combina con el carácter ^ al principio, significa que el patrón debe coincidir con la cadena al completo, sin otros caracteres antes o después de las M.
Abre un archivo .fla, nombrado testRoman.fla y guárdalo en la misma carpeta donde guardaste la clase y coloca las siguientes líneas de código
Código :
import Roman var regExp:Roman = new Roman(); trace(regExp.ValidarRomano("M")); trace(regExp.ValidarRomano("MM")); trace(regExp.ValidarRomano("MMM")); trace(regExp.ValidarRomano("MMMM")); trace(regExp.ValidarRomano(""));
Al ejecutarlo veremos que las 3 primeras cumplen con el patrón y por ende devuelven true, la cuarta debido a que el carácter M se repite cuatro veces no cumple con la condición y arroja false y como dato curioso si pasamos una cadena en blanco devuelve true, esto es debido a que en la condición las M son opcionales. Por ahora tenemos el chequeo de los miles listo, pasemos a las centenas.
Para Las centenas hay 4 posibles patrones a verificar:
- CM
- CD
- 0 a 3 caracteres C
- D, seguido por 0 a 3 caracteres C
Las ultimas 2 pueden combinarse como una D opcional seguida de 0 a 3 caracteres C. Para la nueva validación modifica la variable pattern de la siguiente forma:
Código :
pattern:RegExp = /^M?M?M?(CM|CD|D?C?C?C?)$/;
Concentrémonos en lo nuevo que se halla dentro de lo paréntesis, en el definimos 3 condiciones mutuamente exclusivas separadas por una barra vertical (|), con esto estamos buscamos la aparición de CM ó CD ó una D opcional, seguida de 0 a 3 caracteres. Para probarlo copia en tu archivo .fla lo siguiente:
Código :
trace(regExp.ValidarRomano("MCM")); trace(regExp.ValidarRomano("MD")); trace(regExp.ValidarRomano("MMMCCC")); trace(regExp.ValidarRomano("MCMC")); trace(regExp.ValidarRomano(""));
Para la validación de las decenas y unidades el patrón es muy similar al de los centenas:
Código :
pattern:RegExp = /^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$/;
Ahora solo resta optimizar el patrón, para ello usaremos la metasecuencia {n,m}. En ActionScript las metasecuencias son secuencias de caracteres con un significado especial dentro del patrón de la ER. La metasecuencia {n,m} buscara la aparición de un elemento de 'n' a 'm' veces.
Al final la clase completa se vería de la siguiente forma:
Código :
package { public class Roman{ private var pattern:RegExp = /^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/; function Roman(){ //Constructor de la clase } public function ValidarRomano(romano:String):Boolean{ return pattern.test(romano); } } }
Con esto quedaría listo. En los archivos de descarga podrás encontrar la clase y un ejemplo .fla de su utilización.
En el próximo tip sobre Expresiones Regulares, hablare sobre los flags, los grupos con nombre y veremos una utilización más avanzada de las ER.
[Ve Ejemplo] [Descarga Ejemplo .FLA]
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por MorphX el 13 de Noviembre de 2006
Genial por el Tip
Por Zah el 13 de Noviembre de 2006
Realmente me servirá de mucho.
¿Puedes poner cómo serían todos los operadores lógicos (AND, XOR, NOT, ect)?
Por shogoki el 13 de Noviembre de 2006
Código :
De todos el único que arroja false es el ultimo debido a que le falta la frase Shogoki al final. Ademas gracias al flag "i" que colocamos al final , acepta tanto mayúsculas como minúsculas
Por Zah el 13 de Noviembre de 2006
Por Freddie el 14 de Noviembre de 2006
Por candelaria el 28 de Noviembre de 2006
Por glenda el 06 de Mayo de 2007
Por pedro el 24 de Mayo de 2007
Por yulisa el 20 de Junio de 2007
Por Freddie el 20 de Junio de 2007
yulisa_blog :
Por anddrea el 18 de Julio de 2007
Por claudia el 28 de Agosto de 2007
esta bien su informacion
pero les falta agregar los demas numeros
Por paola valentina el 10 de Noviembre de 2007
27 XXVII
Por yuyi el 31 de Diciembre de 2007
Por victor el 27 de Abril de 2008
Por yolanda el 14 de Mayo de 2008
Por kevin el 03 de Junio de 2008
Por meidyn el 13 de Agosto de 2008
2305 = MMCCCV
MI PREGUNTAS... 5000?
10000?
50000?
100000?
500000?
1000000?
5000000?
Yo creo recordar de la época del colegio, que para estas cantidades que los romanos normalmente no usaban, al poner uno o varios guiones encima de la M o la D multiplicabas el valor de esta x 1000 por cada guion superpuesto... pero no estoy muy seguro... (no se porqué no lo miro en la wikipedia, es que me ha dado nostalgia del cole)
ej:
1.500.000 = MD(con 1 guión encima)(cada guión sería como añadir 3 ceros al final del resultado en decimal)
7.845.439 = D(con 2 - encima) MMDCCCXLV(con 1 - encima)CDXXXIX. el numerico sería asi de largo creo yo:
--D-MMDCCCXLV.CDXXXIX (con los guiones encima y sin el punto)
aunque ya os digo... no estoy seguro del todo
Por gera el 01 de Septiembre de 2008
la maxima kantidad
ke
se
puede
poner
en numeres
Romanoz
Por MAGNOLIA el 03 de Septiembre de 2008
Por naiomi el 30 de Septiembre de 2008
Por german daniel moreno el 20 de Octubre de 2008
Por yulimar el 08 de Noviembre de 2008
Por albany gacia el 12 de Noviembre de 2008
Por lupita el 14 de Noviembre de 2008
Por isis bustillo el 04 de Diciembre de 2008
Por un lerdo el 26 de Febrero de 2009
Por BRIGITTE el 03 de Marzo de 2009
Por LUISA el 03 de Marzo de 2009
Por lola el 23 de Abril de 2009
Por felipe garzon el 15 de Marzo de 2010
listo despues en otro pedaso no metan ni el 200 ni el 300 ni el400 ni el 500 hasta el 1000 solo los que estan por den tro por ejm
123456789 y el 10no
Por ernesto el 23 de Agosto de 2010
Por Enmada el 16 de Septiembre de 2010