Ruby Expresiones regulares

Expresiones regularesEs una secuencia especial de caracteres que, mediante el uso de patrones con sintaxis especializada, empareja o busca conjuntos de cadenas.

Las expresiones regulares utilizan ciertos caracteres específicos predefinidos y combinaciones de estos caracteres para formar una «cadena de reglas», que se usa para expresar una lógica de filtrado sobre cadenas.

Sintaxis

Expresiones regularesLiteralmente, es un patrón que se encuentra entre barras diagonales o entre cualquier delimitador después de %r, como se muestra a continuación:

/pattern/ /pattern/im #Puede especificar opciones %r!/usr/local! #Expresiones regulares con delimitadores

Ejemplos

#!/usr/bin/ruby line1 = "Cats are smarter than dogs"; line2 = "Dogs also like meat"; if ( line1 =~ /Cats(.*)/ ) puts "Line1 contains Cats" end if ( line2 =~ /Cats(.*)/ ) puts "Line2 contains Dogs" end

Pruébalo »

El resultado de ejecutar el ejemplo anterior es:

Line1 contains Cats

Modificadores de expresiones regulares

Literalmente, una expresión regular puede contener modificadores opcionales que controlan varios aspectos de la coincidencia. Los modificadores se especifican después del segundo carácter de barra diagonal, como se muestra en el ejemplo anterior. La siguiente tabla enumera los posibles modificadores:

ModificadorDescripción
iIgnora mayúsculas y minúsculas al hacer coincidir el texto.
oSolo realiza la interpolación #{} una vez; la expresión regular se evalúa la primera vez.
xIgnora los espacios y permite incluir caracteres de espacio en blanco y comentarios en toda la expresión.
mCoincide en varias líneas; trata los caracteres de nueva línea como caracteres normales.
u,e,s,nInterpreta la expresión regular como Unicode (UTF-8), EUC, SJIS o ASCII. Si no se especifica ningún modificador, se considera que la expresión regular utiliza la codificación de origen.

Así como las cadenas se delimitan mediante %Q, Ruby le permite usar %r como inicio de una expresión regular, seguido de cualquier delimitador. Esto es muy útil al describir expresiones que contienen muchos caracteres de barra diagonal que no desea escapar.

#Lo siguiente coincide con un solo carácter de barra diagonal, sin escapar: %r|/| # El carácter de bandera se puede hacer coincidir con la siguiente sintaxis %r[</(.*)>]i

Patrones de expresiones regulares

Excepto los caracteres de control,(+ ? . * ^ $ ( ) [ ] { } | \)todos los demás caracteres coinciden consigo mismos. Puede escapar los caracteres de control colocando una barra invertida delante de ellos.

La siguiente tabla enumera la sintaxis de expresiones regulares disponible en Ruby.

PatrónDescripción
^Coincide con el inicio de una línea.
$Coincide con el final de una línea.
.Coincide con cualquier carácter individual excepto el carácter de nueva línea. Con la opción m, también puede coincidir con caracteres de nueva línea.
[...]Coincide con cualquier carácter individual que esté entre corchetes.
[^...]Coincide con cualquier carácter individual que no esté entre corchetes.
re*Coincide con la subexpresión anterior cero o más veces.
re+Coincide con la subexpresión anterior una o más veces.
re?Coincide con la subexpresión anterior cero o una vez.
re{ n}Coincide con la subexpresión anterior exactamente n veces.
re{ n,}Coincide con la subexpresión anterior n veces o más.
re{ n, m}Coincide con la subexpresión anterior al menos n veces y como máximo m veces.
a| bCoincide con a o b.
(re)Agrupa la expresión regular y recuerda el texto coincidente.
(?imx)Activa temporalmente las opciones i, m o x dentro de la expresión regular. Si están entre paréntesis, solo afectan a la parte dentro de los paréntesis.
(?-imx)Desactiva temporalmente las opciones i, m o x dentro de la expresión regular. Si están entre paréntesis, solo afectan a la parte dentro de los paréntesis.
(?: re)Agrupa la expresión regular, pero no recuerda el texto coincidente.
(?imx: re)Activa temporalmente las opciones i, m o x dentro de los paréntesis.
(?-imx: re)Desactiva temporalmente las opciones i, m o x dentro de los paréntesis.
(?#...)Comentario.
(?= re)Especifica una posición usando un patrón. Sin rango.
(?! re)Especifica una posición usando la negación de un patrón. Sin rango.
(?> re)Coincide con un patrón independiente sin retroceso (backtracking).
\wCoincide con un carácter de palabra.
\WCoincide con un carácter que no es de palabra.
\sCoincide con un carácter de espacio en blanco. Equivalente a [\t\n\r\f].
\SCoincide con un carácter que no es de espacio en blanco.
\dCoincide con un dígito. Equivalente a [0-9].
\DCoincide con un carácter que no es un dígito.
\ACoincide con el inicio de la cadena.
\ZCoincide con el final de la cadena. Si hay un carácter de nueva línea, solo coincide hasta antes de dicho carácter.
\zCoincide con el final de la cadena.
\GCoincide con el punto donde finalizó la última coincidencia.
\bCoincide con el límite de palabra cuando está fuera de los corchetes, y coincide con la tecla de retroceso (0x08) cuando está dentro de los corchetes.
\BCoincide con una posición que no es límite de palabra.
\n, \t, etc.Coincide con caracteres de nueva línea, retorno de carro, tabulación, etc.
\1...\9Coincide con la enésima subexpresión agrupada.
\10Si ya ha coincidido, coincide con la subexpresión agrupada n. De lo contrario, apunta a la representación octal de la codificación de caracteres.

Ejemplos de expresiones regulares

Caracteres

EjemploDescripción
/ruby/Coincide con "ruby"
¥Coincide con el símbolo de yen. Ruby 1.9 y Ruby 1.8 admiten múltiples caracteres.

Clases de caracteres

EjemploDescripción
/[Rr]uby/ Coincide con "Ruby" o "ruby"
/rub[ye]/ Coincide con "ruby" o "rube"
/[aeiou]/Coincide con cualquier vocal minúscula
/[0-9]/ Coincide con cualquier dígito, igual que /
/[a-z]/Coincide con cualquier letra ASCII minúscula
/[A-Z]/Coincide con cualquier letra ASCII mayúscula
/[a-zA-Z0-9]/Coincide con cualquier carácter de los que están entre corchetes
/[^aeiou]/ Coincide con cualquier carácter que no sea una vocal minúscula
/[^0-9]/Coincide con cualquier carácter que no sea un dígito

Clases de caracteres especiales

EjemploDescripción
/./ Coincide con cualquier carácter excepto los caracteres de nueva línea
/./m En modo multilínea, también coincide con caracteres de nueva línea
/\d/Coincide con un dígito, equivalente a /[0-9]/
/\D/ Coincide con un carácter que no es dígito, equivalente a /[^0-9]/
/\s/Coincide con un carácter de espacio en blanco, equivalente a /[ \t\r\n\f]/
/\S/ Coincide con un carácter que no es de espacio en blanco, equivalente a /[^ \t\r\n\f]/
/\w/ Coincide con un carácter de palabra, equivalente a /[A-Za-z0-9_]/
/\W/Coincide con un carácter que no es de palabra, equivalente a /[^A-Za-z0-9_]/

Repetición

EjemploDescripción
/ruby?/ Coincide con "rub" o "ruby". Aquí, y es opcional.
/ruby*/ Coincide con "rub" seguido de cero o más y.
/ruby+/Coincide con "rub" seguido de una o más y.
/\d{3}/Coincide exactamente con 3 dígitos.
/\d{3,}/Coincide con 3 o más dígitos.
/\d{3,5}/Coincide con 3, 4 o 5 dígitos.

Repetición no codiciosa

Esto realiza la coincidencia con el menor número de repeticiones.

EjemploDescripción
/<.*>/Repetición codiciosa: coincide con "<ruby>perl>"
/<.*?>/ Repetición no codiciosa: coincide con "<ruby>" dentro de "<ruby>perl>"

Agrupación mediante paréntesis

EjemploDescripción
/\D\d+/ Sin agrupación: + repite \d
/(\D\d)+/ Con agrupación: + repite los pares \D\d
/([Rr]uby(, )?)+/Coincide con "Ruby", "Ruby, ruby, ruby", etc.

Referencias inversas

Esto vuelve a hacer coincidir el grupo previamente coincidente.

EjemploDescripción
/([Rr])uby&\1ails/Coincide con ruby&rails o Ruby&Rails
/(['"])(?:(?!\1).)*\1/Cadenas entre comillas simples o dobles. \1 coincide con el carácter que coincidió con el primer grupo, \2 con el del segundo grupo, y así sucesivamente.

Alternancia

EjemploDescripción
/ruby|rube/Coincide con "ruby" o "rube"
/rub(y|le)/Coincide con "ruby" o "ruble"
/ruby(!+|\?)/ Cadena "ruby" seguida de uno o más ! o de un ?

ancla

Esto requiere especificar la posición de coincidencia.

EjemploDescripción
/^Ruby/Coincide con cadenas o líneas que comienzan con "Ruby"
/Ruby$/ Coincide con cadenas o líneas que terminan en "Ruby"
/\ARuby/ Coincide con cadenas que comienzan con "Ruby"
/Ruby\Z/Coincide con cadenas que terminan en "Ruby"
/\bRuby\b/Coincide con "Ruby" en límites de palabra
/\brub\B/\B es un no-límite de palabra: coincide con "rub" en "rube" y "ruby", pero no con "rub" solo
/Ruby(?=!)/Coincide con "Ruby" si va seguido de un signo de exclamación
/Ruby(?!!)/ Coincide con "Ruby" si no va seguido de un signo de exclamación

Sintaxis especial de paréntesis

EjemplosDescripción
/R(?#comment)/ Coincide con "R". Todos los caracteres restantes son comentarios.
/R(?i)uby/ No distingue entre mayúsculas y minúsculas al coincidir con "uby".
/R(?i:uby)/ Igual que arriba.
/rub(?:y|le))/Solo agrupa, sin referencia inversa \1

Búsqueda y reemplazo

subygsubY sus variables de reemplazosub!ygsub!Son métodos de cadena importantes al usar expresiones regulares.

Todos estos métodos realizan operaciones de búsqueda y reemplazo utilizando patrones de expresiones regulares.subysub!Reemplaza la primera aparición del patrón,gsubygsub!Reemplaza todas las apariciones del patrón.

subygsubDevuelve una nueva cadena, dejando la cadena original sin modificar, mientras quesub!ygsub!Modifica la cadena sobre la que se llaman.

Ejemplos

#!/usr/bin/ruby # -*- coding: UTF-8 -*- phone = "138-3453-1111 #Este es un número de teléfono" #Eliminar los comentarios de Ruby phone = phone.sub!(/#.*$/, "") puts "Número de teléfono: #{phone}" #Elimina los caracteres que no sean dígitos phone = phone.gsub!(/\D/, "") puts "Número de teléfono: #{phone}"

Pruébalo »

El resultado de ejecutar los ejemplos anteriores es:

电话号码 : 138-3453-1111 
电话号码 : 13834531111

Ejemplos

#!/usr/bin/ruby # -*- coding: UTF-8 -*- text = "rails es rails, Ruby on Rails es un muy buen framework de Ruby" #Cambia todos los "rails" a "Rails" text.gsub!("rails", "Rails") #Cambia todas las palabras "Rails" para que la primera letra esté en mayúscula text.gsub!(/\brails\b/, "Rails") puts "#{text}"

Pruébalo »

El resultado de ejecutar los ejemplos anteriores es:

Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架
Otras extensiones