Overblog Seguir este blog
Edit post Administration Create my blog
5 febrero 2014 3 05 /02 /febrero /2014 03:30

Este tema es muy interesante y la verdad demasiado util, sin mas que decir, una expresión regular es aquel texto que nos sirve para realizar comparaciones, por lo general, contra otras cadenas de texto y ver si coinciden o no.

 

Se pueden usar como patrones, obtener datos y otros usos específicos. Practicamente es todo un pequeño mundo.

 

Comparación básica

 

Una expresión regular en Ruby va delimitado por dos slashes ( / / ) o barras diagonales que encierran un string de la siguiente manera /string/ por ejemplo vamos a crear una que nos sirva para detectar cadenas de texto que contengan la palabra bono.

 

irb(main):251:0> /bono/.class

=> Regexp

irb(main):252:0> /bono/.match "no hay bono"

=> #<MatchData "bono">

irb(main):253:0> /bono/.match "no hay nada"

=> nil

 

Como se puede ver, la expresión regular proviene de la clase Regexp, por lo que es un objeto y tiene métodos, usamos en la línea 252 el método match, el cual compara la expresión regular /bono/ contra la frase "no hay bono" y como esta frase contiene la expresión "bono" que buscamos, osea "coincide", entonces devuelve un objeto de la clase MatchData, en la línea 253 la expresión regular /bono/ no coincide con la frase "no hay nada" entonces al no existir "coincidencia" devuelve un nil.

 

irb(main):292:0> /bono/ =~ "no hay bono"

=> 7

irb(main):293:0> /bono/ =~ "no hay nada"

=> nil

 

Esta es otra forma de comparar con el operador " =~ " el cual, si existe coincidencia devuelve la posición en donde empieza la coincidencia mediante un número entero, caso contrario devuelve nil.

 

Ahora el resultado de este operador se puede conseguir mediante el objeto devuelto de la clase MatchData:

 

irb(main):294:0> /bono/.match("no hay bono").pre_match.length

=> 7

 

El objeto match tiene varios métodos entre ellos el pre_match y post_match, que devuelven la cadena de texto antes de la coincidencia y despues de la coincidencia respectivamente:

 

irb(main):295:0> /bono/.match("no hay bono, que pena").pre_match

=> "no hay "

irb(main):296:0> /bono/.match("no hay bono, que pena").post_match

=> ", que pena"

 

Captura de valores

 

Según la expresión regular, es posible capturar diversos valores de un determinado texto, por ejemplo las carácterísticas frases: "Juego de manos, juego de villanos", para poder capturar las palabras manos y villanos, podemos usar lo siguiente:

 

irb(main):300:0> expresion = /^Juego de (\w+), juego de (\w+)$/

=> /^Juego de (\w+), juego de (\w+)$/

irb(main):301:0> frase = "Juego de manos, juego de villanos"

=> "Juego de manos, juego de villanos"

irb(main):302:0> resultado = expresion.match frase

=> #<MatchData "Juego de manos, juego de villanos" 1:"manos" 2:"villanos">

irb(main):303:0> resultado.captures

=> ["manos", "villanos"]

irb(main):304:0> otra_frase = "Juego de manitos, juego de villanitos"

=> "Juego de manitos, juego de villanitos"

irb(main):305:0> resultado = expresion.match otra_frase

=> #<MatchData "Juego de manitos, juego de villanitos" 1:"manitos" 2:"villanitos">

irb(main):306:0> resultado.captures

=> ["manitos", "villanitos"]

 

Aquí tenemos varios casos, para comenzar solo mencionaré los mas importanes ya que las expresiones regulares tienen un amplio abanico de posibilidades.

 

En la linea 300 hemos colocado una expresion regular en la variable expresion, el contenido de la expresion regular es la siguiente; Después del primer delimitador " / ", luego viene el símbolo ^ que indica que la frase debe comenzar exactamente de esa manera "Juego de...", luego sigue una porción de la frase y nos encontramos con (\w+), estos son justamente lo que se captura, a detalle todo lo que esta en paréntesis " ( " y " ) " es capturado, dentro de lo capturado el \w significa que va a validar 1 sola letra, o número o puntuación, ahora el símbolo mas " + " significa que no sea 1 sola letra sino que sean varias (hasta que ya no se cumpla dicha especificación, como puede ser un espacio en blanco), luego realiza su primera captura, mas adelante hay otro (\w+) lo capturará y termina con un símbolo de dolar $, que significa que la frase debe terminar ahí y no debe haber nada más.

 

En la línea 303, usamos el método "captures" del objeto resultado (MatchData) y nos devuelve una matriz de los valores que han sido capturados.

 

En la línea 304 hacemos una variación a la frase y volvemos a capturar los valores en el 306, como verán existe una coincidencia y ahora nos muestra los nuevos valores capturados.

 

Bueno esto es solo una introducción a las expresiones regulares, existe mucho pero mucho por investigar en expresiones regulares y lo bueno es que ahorra un montón de líneas de código.

 

Muy bien, existen mucho mas cosas que se pueden hacer pero lo veremos en los proximos capitulos, hasta aqui vamos con el capitulo 16, el siguiente es el capitulo 17, cualquier duda pueden comentar y sera absuelto, no tienes que registrarte ni realizar nada adicional para comentar.

Compartir este post

Repost 0
Published by Daniel A. Nuñez C. - en Tutorial Ruby
Comenta este artículo

Comentarios

Presentación

  • : El blog de Daniel A. Nuñez C.
  • El blog de Daniel A. Nuñez C.
  • : Un blog sobre tecnologías y futuro, también sobre lenguaje de programación Ruby y más.
  • Contacto

Perfil

  • Daniel A. Nuñez C.
  • Ingeniero de Sistemas
  • Ingeniero de Sistemas

Donaciones/Donations

Por favor considera realizar una donación

Please make a donation

btn_donateCC_LG.png

Buscar Tema En Este Blog

Archivos