Comunidad de diseño web y desarrollo en internet online

Expresiones Regulares en ActionScript 3. Tip 1

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
Las siguientes son algunas reglas generales que debemos tener en cuenta al construir números romanos:
  • 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.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate