English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Expresiones regulares en Ruby

Expresión regularEs una secuencia especial de caracteres que utiliza patrones con una gramática específica para coincidir o buscar conjuntos de cadenas.

La expresión regular se compone de algunos caracteres específicos previamente definidos y sus combinaciones, formando una "cadena de reglas" que se utiliza para expresar un lógica de filtrado de cadenas.

Sintaxis

Expresión regularEn términos generales, es un patrón entre dos barras oblicuas o entre cualquier delimitador que siga a %r, como se muestra a continuación:

 /patrón/
/patrón/im    # Se pueden especificar opciones
%r!/usr/local! # Expresión regular con delimitadores

Ejemplo en línea

#!/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

El resultado de ejecutar el ejemplo anterior es:

Line1 contains Cats

Modificadores de expresión regular

La expresión regular puede contener un modificador opcional, que se utiliza para controlar各个方面 de la coincidencia. Los modificadores se especifican después del segundo carácter de barra oblicua, como se muestra en el ejemplo anterior. A continuación se lista los modificadores posibles:

Modificadoresdescripción
iIgnorar mayúsculas y minúsculas al coincidir con el texto.
oEjecutar solo una vez la interpolación #{}, la expresión regular se evalúa en el primer intento.
xIgnorar los espacios en blanco, se permite insertar caracteres de espacio en blanco y comentarios en toda la expresión.
mCoincidir con múltiples líneas, considerando el carácter de nueva línea como un carácter normal.
u,e,s,nInterpretar la expresión regular como Unicode (UTF-8)、EUC、SJIS o ASCII. Si no se especifica un modificador, se considera que la expresión regular utiliza la codificación de origen.

Al igual que las cadenas se separan mediante %Q, Ruby permite comenzar con %r como inicio de la expresión regular, seguido de cualquier separador. Esto es muy útil cuando se describe una gran cantidad de caracteres de diagonal invertida que no se desean escapar.

# Coincidir con el carácter de diagonal invertida sin escapar
%r|/|               
 
# Caracteres de bandera se pueden coincidir con la siguiente sintaxis
%r[</(.*)>]i

Patrón de expresión regular

Además de los caracteres de control,(+ ? . * ^ $ ( ) [ ] { } | \),otros caracteres coinciden con ellos mismos. Puede escapar los caracteres de control colocando un carácter de retroceso delante de ellos.

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

Patróndescripción
^Coincidir con el principio de la línea.
$Coincidir con el final de la línea.
.Coincidir con cualquier carácter simple excepto el carácter de nueva línea. Al usar la opción m, también puede coincidir con el carácter de nueva línea.
[...]Coincidir con cualquier carácter simple que esté entre corchetes.
[^...]Coincidir con cualquier carácter simple que no esté entre corchetes.
re*Coincidir con la subexpresión anterior cero veces o más.
re+Coincidir con la subexpresión anterior una vez o más.
re?Coincidir con la subexpresión anterior cero veces o una vez.
re{ n}Coincidir con la subexpresión anterior n veces.
re{ n,}Coincidir con la subexpresión anterior n veces o más.
re{ n, m}Coincidir con la subexpresión anterior al menos n veces y hasta m veces.
a| bCoincidir con a o b.
(re)Agrupar la expresión regular y recordar el texto coincidente.
(?imx)Abrir temporalmente las opciones i, m o x dentro de la expresión regular. Si están dentro de paréntesis, solo afecta a la parte dentro de los paréntesis.
(?-imx)Cerrar temporalmente las opciones i, m o x dentro de la expresión regular. Si están dentro de paréntesis, solo afecta a la parte dentro de los paréntesis.
(?: re)Agrupar la expresión regular sin recordar el texto coincidente.
(?imx: re)Abrir temporalmente las opciones i, m o x dentro de los paréntesis.
(?-imx: re)Cerrar temporalmente las opciones i, m o x dentro de los paréntesis.
(?#...)Comentario.
(?= re)Especificar la posición mediante el patrón. Sin rango.
(?! re)Especificar la posición mediante el negativo del patrón. Sin rango.
(?> re)Coincide con patrones independientes sin retroceso.
\wCoincide con caracteres de palabra.
\WCoincide con caracteres no de palabra.
\sCoincidir con el carácter blanco. Equivalente a [\t\n\r\f]。
\SCoincidir con el carácter no blanco.
\dCoincidir con el carácter numérico. Equivalente a [0-9]。
\DCoincidir con el carácter no numérico.
\ACoincidir con el principio de la cadena.
\ZCoincidir con el final de la cadena. Si existe un carácter de nueva línea, solo coincidirá con el carácter de nueva línea anterior.
\zCoincidir con el final de la cadena.
\GCoincidir con el punto que se ha coincidido recientemente.
\bCoincidirá con el límite de palabra cuando esté fuera de los paréntesis, y con la tecla de retroceso (0x08)。
\BCoincidir con el límite no palabra.
\n, \t, etc.Coincidir con el carácter de nueva línea, el carácter de retorno de carro, el carácter de tabulación, etc.
\1...\9Coincidir con la subexpresión de grupo n.
\10Si ya se ha coincidido, coincidirá con la subexpresión de grupo n. De lo contrario, apuntará a la representación octal del código de caracteres.

Ejemplo de expresión regular

carácter

ejemplodescripción
/ruby/Coincidir con "ruby"
¥Coincidir con el símbolo de Yen. Ruby 1.9 y Ruby 1.8 Soporta múltiples caracteres.

Clase de caracteres

ejemplodescripción
/[Rr]uby/Coincidir "Ruby" o "ruby"
/rub[ye]/coincide con "ruby" o "rube"
/[aeiou]/Coincidir con cualquier vocal minúscula
/[0-9]/Coincidir con cualquier número, equivalente a /[0123456789]/ Igual
/[a-z]/Coincidir con cualquier carácter minúscula ASCII
/[A-Z]/Coincidir con cualquier carácter mayúscula ASCII
/[a-zA-Z0-9]/Coincidir con cualquier carácter entre paréntesis
/[^aeiou]/Coincidir con cualquier carácter no vocal minúscula
/[^0-9]/Coincidir con cualquier carácter no numérico

Clase de caracteres especiales

ejemplodescripción
/./Coincidir cualquier carácter excepto el carácter de nueva línea
/./mEn modo de múltiples líneas, también coincidirá con el carácter de nueva línea
/\d/Coincidir un carácter numérico, equivalente a /[0-9]/
/\D/Coincidir un carácter no numérico, equivalente a /[^0-9]/
/\s/Coincidir un carácter blanco, equivalente a /[ \t\r\n\f]/
/\S/Coincidir un carácter no blanco, equivalente a /[^ \t\r\n\f]/
/\w/Coincidir un carácter de palabra, equivalente a /[A-Za-z0-9_]/
/\W/Coincidir un carácter no palabra, equivalente a /[^A-Za-z0-9_]/

Repetición

ejemplodescripción
/ruby?/Coincidir "rub" o "ruby". Donde y es opcional.
/ruby*/Coincidir "rub" más 0 veces o varias de y.
/ruby+/Coincidir "rub" más 1 un número o varios de y.
/\d{3}/Coincidir exactamente 3 un número.
/\d{3,}/Coincidir 3 un número o varios.
/\d{3,5}/Coincidir 3 un,4 o 5 un número.

Repetición no voraz

Esto coincidirá con la repetición mínima.

ejemplodescripción
/<.*>/Repetición voraz: coincidir "<ruby>perl>"
/<.*?>/Repetición no voraz: coincidir "<ruby>perl>" con "<ruby>"

Agrupar mediante paréntesis

ejemplodescripción
/\D\d+/sin grupo: + repetir \d
/(\D\d)+/grupo: + repetir \D\d
/([Rr]uby(, )?)+/coincide con "Ruby", "Ruby, ruby, ruby", etc.

referencias inversas

esto volverá a coincidir con el grupo coincidido anteriormente.

ejemplodescripción
/([Rr])uby&\1ails/coincide con ruby&rails o Ruby&Rails
/(['"])(?:(?!\1).)*\1/cadenas de caracteres entre comillas simples o dobles.\1 coincide con el primer grupo de coincidencia, \2 coincide con el segundo grupo de coincidencia, etc.

reemplazo

ejemplodescripción
/ruby|rube/coincide con "ruby" o "rube"
/rub(y|le)/coincide con "ruby" o "ruble"
/ruby(!+|\?)/"ruby" seguido de uno o más ! o seguido de un ?

ancla

esto requiere especificar la posición de coincidencia.

ejemplodescripción
/^Ruby/coincide con la cadena que comienza con "Ruby" o la línea
/Ruby$/coincide con la cadena que termina con "Ruby" o la línea
/\ARuby/coincide con la cadena que comienza con "Ruby"
/Ruby\Z/coincide con la cadena que termina con "Ruby"
/\bRuby\b/coincide con el límite de palabra "Ruby"
/\brub\B/\B es un límite no de palabra: coincide con "rube" y "ruby" pero no coincide con "rub" por sí solo
/Ruby(?=!)/si después de "Ruby" sigue un exclamation mark, coincide con "Ruby"
/Ruby(?!!)/si después de "Ruby" no sigue un exclamation mark, coincide con "Ruby"

sintaxis especial de los paréntesis redondos

ejemplodescripció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)/es igual que el anterior.
/rub(?:y|le))/solo agrupar, sin \1 referencias inversas

búsqueda y reemplazo

sub y gsub y sus variables de sustitución sub! y gsub! son métodos de cadena importantes al usar expresiones regulares.

todas estas métodos son usados para realizar búsquedas y reemplazos con patrones de expresiones regulares.sub y sub! reemplazan la primera aparición del patrón,gsub y gsub! reemplazan todas las apariciones del patrón.

sub y gsub devuelven una nueva cadena de caracteres, manteniendo la cadena original inmodificada, y sub! y gsub! modificarán las cadenas de caracteres que llaman.

Ejemplo en línea

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

El resultado de ejecutar el ejemplo anterior es:

Número de teléfono : 138-3453-1111 
Número de teléfono : 13834531111

Ejemplo en línea

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
text = "rails es rails, Ruby on Rails es un excelente framework de Ruby"
 
# Cambiar todas las "rails" a "Rails"
text.gsub!("rails", "Rails")
 
# Cambiar todas las palabras "Rails" a mayúscula
text.gsub!(/\brails\b/, "Rails")
 
puts "#{text}"

El resultado de ejecutar el ejemplo anterior es:

Rails es un excelente framework de Ruby on Rails