Tutorial de Ruby – Parte 12 – Expresiones regulares

ruby-mini-logo8.3. Expresiones regulares

 

Por último examinaremos el programa del capítulo sobre expresiones regulares.

 

01 st = «\033[7m»

02 en = «\033[m»

03

04 while TRUE

05 print «str> «

06 STDOUT.flush

07 str = gets

08 break if not str

09 str.chop!

10 print «pat> «

11 STDOUT.flush

12 re = gets

13 break if not re

14 re.chop!

15 str.gsub! re, «#{st}\\&#{en}»

16 print str, «\n»

17 end

18 print «\n»

 

En la línea 4, se ha fijado la condición del while a true con lo que se obtiene un bucle infinito. Sin embargo se han colocado sentencias break en las líneas octava y decimotercera para salir del bucle. Estos dos breaks ejemplifican también el uso de los modificadores if. Un “modificador if” ejecuta la sentencia del lado izquierdo si y sólo si se satisface la condición especificada.

Hay más cosas que decir sobre chop! (veanse las líneas 9 y 14). En Ruby se añade, por convención, ! o ? al final de ciertos nombre de métodos. El marca de exclamación (!, pronunciada como un “bang!” sonoro) recalca algo potencialmente peligroso, es decir, algo que puede modificar el valor de lo que toca. chop! afecta directamente a la cadena pero chop sin el signo de exclamación actúa sobre una copia. A continuación se muestra la diferencia.

 

ruby> s1 = «forth»

«forth»

ruby> s1.chop! # modifica s1

«fort»

ruby> s2 = s1.chop # sitúa en s2 una copia de la modificación

«for»

ruby> s1 # … sin afectar a s1

«fort»

 

Posteriormente no encontraremos con nombres de métodos que finalizan con un signo de interrogación (?, pronunciada a veces como un “huh?” sonoro). Esto indica que el método es un “predicado”, aquel que puede devolver o true o false.

La línea 15 requiere una especial atención. Primero, se observa que gsub! es otro de los denominados métodos destructivos. Modifica str al reemplazar toda coincidencia del patrón re (sub significa sustituir, la g inicial indica que la sustitución es global, es decir reemplaza todas las coincidencias que hay en la cadena no sólo la primera encontrada).

Hasta el momento todo parece correcto pero, ¿Por qué reemplazamos las coincidencias del texto? st y en se definieron en las líneas 1 y 2 como secuencias ANSI que presentan el color del texto como invertido o normal respectivamente. En la línea 15 se encuentran encerradas entre #{} para asegurar que se interpreten por lo que son (y no se impriman los nombres de las variables). Entre ella se ve “\\&”. Esto es un pequeño truco. Dado que la sentencia de reemplazo se encuentra entre comillas dobles, los dos backslashes se interpretarán como uno solo, que gsub! verá como “\&” que no es otra cosa que el código que representa la primera coincidencia del patrón. Por lo tanto la nueva cadena, al imprimirse, será igual que la antigua, excepto que las partes que coinciden con el patrón aparecen resaltadas en vídeo inverso.

Otras fuentes para consultar:

  • http://www.elwebmaster.com/general/ruby-principiantes-expresiones-regulares
  • http://rubular.com/
  • http://rubytutorial.wikidot.com/expresion
  • http://linuxmanr4.com/2014/08/19/expresiones-regulares-con-ruby/
  • http://www.elclubdelprogramador.com/2012/03/07/ruby-expresiones-regulares-a-fondo-i-parte/
  • http://blog.logicalbricks.com/node/98
  • http://picandocodigo.net/2013/expresiones-regulares-en-ruby/
  • https://useindex.wordpress.com/2011/03/23/expresiones-regulares-y-api-de-rails/
  • http://danielantonionunez.over-blog.com/article-16-expresiones-regulares-en-ruby-122407239.html

 

VIDEO — Sesión 8. Expresiones Regulares en Rub

¿Tienes alguna consulta?
¿Tienes algún ejemplo sobre este tema que no entiendas?
¿Quieres compartir con nosotros algún código relacionado?

Gus Terrera

Apasionado por el agile testing y la ia.

Deja una respuesta