comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Expresiones Regulares - by pRoToS

  • 0 Respuestas
  • 1505 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5325
  • Actividad:
    51.67%
  • Reputación 29
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Febrero 24, 2010, 04:17:28 pm »
En este capitulo explicar? el uso de las expresiones regulares en Ruby. Es una de las cosas que menos me gustan, ya que puede resultar algo lioso, pero que nos puede ser muy util codeando y nos puede ahorrar muchas linias de programa.

Se utilizan para comprobar si un texto (string ) contiene el patron que nosotros establezcamos. Es decir, comprobar si determinada variable string contiene el patron que nosotros queramos.

Las expresiones regulares se encierran entre //, y el operador para comprobar 'si contiene' es =~

Veamoslo con ejemplos:

Código: You are not allowed to view links. Register or Login
irb
irb(main):001:0> cadena = "capitulo de expresiones regulares"
=> "capitulo de expresiones regulares"
irb(main):002:0> if cadena =~ /capitulo/
irb(main):003:1> ^C
irb(main):003:0>
irb(main):004:0* exit
protos@diego-desktop:~$ irb
irb(main):001:0> cadena = "Esto es el capitulo de expresiones regulares"
=> "Esto es el capitulo de expresiones regulares"
irb(main):002:0> if cadena =~ /guia/
irb(main):003:1> puts 'Es una guia'
irb(main):004:1> elsif cadena =~ /capitulo/
irb(main):005:1> puts 'es un capitulo'
irb(main):006:1> end
es un capitulo

Como vemos creamos una cadena, y comprobamos si contiene en primera instancia, guia y en segunda capitulo, como no contiene el patro 'guia' pero si el patron 'capitulo', pues se efectuar? lo del elsif...
Hasta aqui sencillo ;)

Algunas veces nos interesar? buscar patrones que no son exactos, por ejemplo, no me interesa saber si la string contiene especificamente 'capitulo', sino cualquier palabra que empiece por c y acabe en o ya me sirve...

Antes de resolver ese problema, os dejo la siguiente tabla, son unas abreviaciones que nos ofrecen las expresiones regulares:

expresi?n    significado
.    cualquier caracter
[]    especificaci?n por rango. P.ej: [a-z], una letra de la a, a la z
\w    letra o n?mero; es lo mismo que [0-9A-Za-z]
\W    cualquier car?cter que no sea letra o n?mero
\s    car?cter de espacio; es lo mismo que [ \t\n\r\f]
\S    cualquier car?cter que no sea de espacio
\d    n?mero; lo mismo que [0-9]
\D    cualquier car?cter que no sea un n?mero
\b    retroceso (0x08), si est? dentro de un rango
\b    l?mite de palabra, si NO est? dentro de un rango
\B    no l?mite de palabra
*    cero o m?s repeticiones de lo que le precede
+    una o m?s repeticiones de lo que le precede
$    fin de la l?nea
{m,n}    como menos m, y como mucho n repeticioes de lo que le precede
?    al menos una repetici?n de lo que le precede; lo mismo que {0,1}
()    agrupar expresiones
||    operador l?gico O, busca lo de antes o lo despu?s



(encontrar?is mas expresiones asi en la documentaci?n :P)

Estos son las expresiones especiales, que nos sirven para abreviar, sintetizar, o encontrar rangos, repeticiones etc... En el caso de que queramos buscar por ejemplo el signo + en una string, resulta que si ponemos + entre // lo detectar? como expresion especial y buscar? una o mas repeticiones de lo que le precede...Para solucionar est, cuando queramos encontrar cualquier expresion de las de la tabla, no su significado, lo escaparemos con \

Ejemplo:
Código: You are not allowed to view links. Register or Login
/s+a/ buscar? ssa o sssa, sssssa, ssssssa, etc
/s\+a/ buscar? s+a.

Es importante saberse las abreviaciones, ya que nos ser?n muy ?tiles para las expresiones regulares, si alguien no entiende alguna expresion de las anteriores, que pregunte porfavor :)

Y es aqu? donde se complica la cosa, ya que con tantas expresiones, a veces las expresiones regulares se hacen inentendibles, o se ven muchos simbolos y lian a uno....xD, esto es muy importante saberse los simbolos y practicar.

Vamos a ver otro ejemplo sencillito:

Código: You are not allowed to view links. Register or Login
cadena = "perro perra paco poco poca pato mato peto pete mete sota"
if cadena =~ /p\w*o\s/
puts "El string contiene algo que empieza por p y acaba por o"
end

Analizemos el patron: /p\w*o\s/
Primero una p, luego cualquier caracter (\w) repetido las veces que sea (*), luego una o, y luego un espacio (\s)
Con eso concordaria perro, porro, paarrrooruweqno , etc....


VARIABLES $


Este tipo de variables solo surgen cuando agrupamos alguna expresion con (), pongamos un ejemplo y lo veremos:
Sigamos con el mismo ejemplo tonto de antes
Código: You are not allowed to view links. Register or Login
cadena = "perro"
if cadena =~ /p(\w+)o/
puts $1
end

Y esto nos dar? ''err''
Explicaci?n: Hemos buscado algo que empiece por p, contenga varias vececes cualquier caracter y acabe por o, pero hemos puesto entre parentesis lo que haya entre la p y la o. Las variables $ apuntan a las agrupaciones de expresiones (a lo que hayamos puesto entre () ), por eso nosotros ponemos $1 y nos devuelve lo que en nuestra cadena correspondia a (\w+). Si tuvieramos dos expresiones agrupadas entre parentesis, $1 apuntaria a la primera agrupacion, $2 a la segunda, etc....

Hmm esto igual es algo lioso, si no se entiende preguntad que es que me explico mal xD.

MATCH


Bueno, hemos visto que para comprobar si una string contiene un patron, lo haciamos con //, realmente se puede hacer de otra manera tambien:

Código: You are not allowed to view links. Register or Login
var=patron.match(string)ej
Código: You are not allowed to view links. Register or Login
var=/a/.match("esto contiene la a?")Si no hay coincidencias se te devolver? un nil
Si hay coincidencia tendremos un objeto MatchData apuntado por la variable var.
Este objeto almacenar? mucha info, de entrada un true booleano porque ha hayado coincidencias, y luego almacenar? tambien
en que caracter del string empieza la coincidencia, cuanto ocupa la coincidencia del string, ademas de las $ entre otras cosas, para ver los metodos de la clase MatchData que nos permiten hacer esas cosas acudimos a la pagina de la documentacion oficial porque est? muy bien hecho y a mi no me apetece repasar todos los metodos:
You are not allowed to view links. Register or Login



Y con esto voy acabando el capitulo, pondr? ejercicios de expresiones regulares si alguien quiere y no le resulta insoportable, casi casi son como jeroglificos, con lo de ejercicio me refiero a algo asi:

Daria coincidencia?
string = " me gusta el basket"
patron = /\s(\S\D)\s(g\w*a)\s(el).*/

De entrada podeis contestar aqui mismo este...si quereis mas los preparo ;)


Bibliografia:

You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login




 

¿Te gustó el post? COMPARTILO!



Ruby HTTP Toolz - by pRotos

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1314
Último mensaje Febrero 24, 2010, 04:11:16 pm
por ANTRAX
MultiConsole (pequeña libreria) - by pRoTos

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1142
Último mensaje Febrero 24, 2010, 04:10:25 pm
por ANTRAX
Encriptador MD5, Sha-1 y Base64 (by protos)

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1331
Último mensaje Febrero 24, 2010, 04:05:32 pm
por ANTRAX
Escribir scripts CGI (by pRotos)

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1621
Último mensaje Febrero 24, 2010, 04:20:31 pm
por ANTRAX
Crackeador sin diccionario (by Protos)

Iniciado por ANTRAX

Respuestas: 0
Vistas: 951
Último mensaje Febrero 24, 2010, 04:06:06 pm
por ANTRAX