Ruby - Expresiones regulares

Una expresión regular es una secuencia especial de caracteres que le ayuda a hacer coincidir o encontrar otras cadenas o conjuntos de cadenas utilizando una sintaxis especializada contenida en un patrón.

Un literal de expresión regular es un patrón entre barras o entre delimitadores arbitrarios seguido de% r de la siguiente manera:

Sintaxis

/pattern/
/pattern/im    # option can be specified
%r!/usr/local! # general delimited regular expression

Ejemplo

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

Esto producirá el siguiente resultado:

Line1 contains Cats

Modificadores de expresiones regulares

Los literales de expresión regular pueden incluir un modificador opcional para controlar varios aspectos de la coincidencia. El modificador se especifica después del segundo carácter de barra, como se mostró anteriormente y puede estar representado por uno de estos caracteres:

No Señor. Modificador y descripción
1

i

Ignora las mayúsculas y minúsculas al hacer coincidir el texto.

2

o

Realiza # {} interpolaciones solo una vez, la primera vez que se evalúa el literal regexp.

3

x

Ignora los espacios en blanco y permite comentarios en expresiones regulares.

4

m

Coincide con varias líneas, reconociendo nuevas líneas como caracteres normales.

5

u,e,s,n

Interpreta la expresión regular como Unicode (UTF-8), EUC, SJIS o ASCII. Si no se especifica ninguno de estos modificadores, se supone que la expresión regular utiliza la codificación de origen.

Al igual que los literales de cadena delimitados con% Q, Ruby le permite comenzar sus expresiones regulares con% r seguido de un delimitador de su elección. Esto es útil cuando el patrón que está describiendo contiene muchos caracteres de barra diagonal de los que no desea escapar.

# Following matches a single slash character, no escape required
%r|/|

# Flag characters are allowed with this syntax, too
%r[</(.*)>]i

Patrones de expresión regular

Excepto por los personajes de control, (+ ? . * ^ $ ( ) [ ] { } | \), todos los personajes coinciden. Puede escapar de un carácter de control precediéndolo con una barra invertida.

No Señor. Patrón y descripción
1

^

Coincide con el comienzo de la línea.

2

$

Coincide con el final de la línea.

3

.

Coincide con cualquier carácter individual excepto nueva línea. El uso de la opción m también le permite hacer coincidir la nueva línea.

4

[...]

Coincide con cualquier carácter individual entre paréntesis.

5

[^...]

Coincide con cualquier carácter individual que no esté entre corchetes

6

re*

Coincide con 0 o más apariciones de la expresión anterior.

7

re+

Coincide con 1 o más ocurrencias de la expresión anterior.

8

re?

Coincide con 0 o 1 aparición de la expresión anterior.

9

re{ n}

Coincide exactamente con n número de apariciones de la expresión anterior.

10

re{ n,}

Coincide con no más ocurrencias de la expresión anterior.

11

re{ n, m}

Coincide con al menos n y como máximo m apariciones de la expresión anterior.

12

a| b

Coincide con a o b.

13

(re)

Agrupa expresiones regulares y recuerda texto coincidente.

14

(?imx)

Alterna temporalmente entre las opciones i, m o x dentro de una expresión regular. Si está entre paréntesis, solo esa área se ve afectada.

15

(?-imx)

Desactiva temporalmente las opciones i, m o x dentro de una expresión regular. Si está entre paréntesis, solo esa área se ve afectada.

dieciséis

(?: re)

Agrupa expresiones regulares sin recordar el texto coincidente.

17

(?imx: re)

Alterna temporalmente entre las opciones i, m o x entre paréntesis.

18

(?-imx: re)

Desactiva temporalmente las opciones i, m o x entre paréntesis.

19

(?#...)

Comentario.

20

(?= re)

Especifica la posición mediante un patrón. No tiene rango.

21

(?! re)

Especifica la posición mediante la negación del patrón. No tiene rango.

22

(?> re)

Coincide con el patrón independiente sin retroceso.

23

\w

Coincide con caracteres de palabras.

24

\W

Coincide con caracteres que no son palabras.

25

\s

Coincide con los espacios en blanco. Equivalente a [\ t \ n \ r \ f].

26

\S

Coincide con espacios que no son en blanco.

27

\d

Coincide con dígitos. Equivalente a [0-9].

28

\D

Coincide con no dígitos.

29

\A

Coincide con el comienzo de la cadena.

30

\Z

Coincide con el final de la cuerda. Si existe una nueva línea, coincide justo antes de la nueva línea.

31

\z

Coincide con el final de la cuerda.

32

\G

Los partidos apuntan donde terminó el último partido.

33

\b

Coincide con los límites de las palabras cuando están fuera de los corchetes. Coincide con el retroceso (0x08) cuando está entre corchetes.

34

\B

Coincide con los límites que no son palabras.

35

\n, \t, etc.

Coincide con nuevas líneas, retornos de carro, pestañas, etc.

36

\1...\9

Coincide con la enésima subexpresión agrupada.

37

\10

Coincide con la enésima subexpresión agrupada si ya coincidió. De lo contrario, se refiere a la representación octal de un código de carácter.

Ejemplos de expresiones regulares

No Señor. Ejemplo y descripción
1

/ruby/

Coincide con "ruby".

2

¥

Coincide con el signo del Yen. Los caracteres multibyte son compatibles con Ruby 1.9 y Ruby 1.8.

No Señor. Ejemplo y descripción
1

/[Rr]uby/

Coincide con "Ruby" o "ruby".

2

/rub[ye]/

Coincide con "ruby" o "rube".

3

/[aeiou]/

Coincide con cualquier vocal en minúscula.

4

/[0-9]/

Coincide con cualquier dígito; igual que / [0123456789] /.

5

/[a-z]/

Coincide con cualquier letra ASCII minúscula.

6

/[A-Z]/

Coincide con cualquier letra ASCII mayúscula.

7

/[a-zA-Z0-9]/

Coincide con cualquiera de los anteriores.

8

/[^aeiou]/

Coincide con cualquier otra cosa que no sea una vocal en minúscula.

9

/[^0-9]/

Coincide con cualquier cosa que no sea un dígito.

No Señor. Ejemplo y descripción
1

/./

Coincide con cualquier carácter excepto nueva línea.

2

/./m

En el modo multilínea, también coincide con la nueva línea.

3

/\d/

Coincide con un dígito: / [0-9] /.

4

/\D/

Coincide con un no dígito: / [^ 0-9] /.

5

/\s/

Coincide con un carácter de espacio en blanco: / [\ t \ r \ n \ f] /.

6

/\S/

Coincide con espacios que no son en blanco: / [^ \ t \ r \ n \ f] /.

7

/\w/

Coincide con un carácter de una sola palabra: / [A-Za-z0-9 _] /.

8

/\W/

Coincide con un carácter que no es una palabra: / [^ A-Za-z0-9 _] /.

No Señor. Ejemplo y descripción
1

/ruby?/

Coincide con "rub" o "ruby": la y es opcional.

2

/ruby*/

Coincide con "frotar" más 0 o más ys.

3

/ruby+/

Coincide con "frotar" más 1 o más años.

4

/\d{3}/

Coincide exactamente con 3 dígitos.

5

/\d{3,}/

Coincide con 3 o más dígitos.

6

/\d{3,5}/

Coincide con 3, 4 o 5 dígitos.

Esto coincide con el menor número de repeticiones:

No Señor. Ejemplo y descripción
1

/<.*>/

Repetición codiciosa: coincide con "<ruby> perl>".

2

/<.*?>/

No codicioso: coincide con "<ruby>" en "<ruby> perl>".

No Señor. Ejemplo y descripción
1

/\D\d+/

Sin grupo: + repeticiones \ d

2

/(\D\d)+/

Agrupados: + repeticiones \ D \ d par

3

/([Rr]uby(, )?)+/

Coincide con "Ruby", "Ruby, ruby, ruby", etc.

Esto vuelve a coincidir con un grupo previamente emparejado:

No Señor. Ejemplo y descripción
1

/([Rr])uby&\1ails/

Combina con ruby ​​& rails o Ruby & Rails.

2

/(['"])(?:(?!\1).)*\1/

Cadena de comillas simples o dobles. \ 1 coincide con cualquier coincidencia del primer grupo. \ 2 coincide con lo que coincida con el segundo grupo, etc.

No Señor. Ejemplo y descripción
1

/ruby|rube/

Coincide con "ruby" o "rube".

2

/rub(y|le))/

Coincide con "ruby" o "rublo".

3

/ruby(!+|\?)/

"ruby" seguido de uno o más! o uno ?

Necesita especificar la posición de coincidencia.

No Señor. Ejemplo y descripción
1

/^Ruby/

Coincide con "Ruby" al comienzo de una cadena o línea interna.

2

/Ruby$/

Coincide con "Ruby" al final de una cadena o línea.

3

/\ARuby/

Coincide con "Ruby" al comienzo de una cadena.

4

/Ruby\Z/

Coincide con "Ruby" al final de una cadena.

5

/\bRuby\b/

Coincide con "Ruby" en el límite de una palabra.

6

/\brub\B/

\ B es un límite sin palabras: coincide con "rub" en "rube" y "ruby", pero no solo.

7

/Ruby(?=!)/

Coincide con "Ruby", si va seguido de un signo de exclamación.

8

/Ruby(?!!)/

Coincide con "Ruby", si no va seguido de un signo de exclamación.

No Señor. Ejemplo y descripción
1

/R(?#comment)/

Coincide con "R". Todo lo demás es un comentario.

2

/R(?i)uby/

No distingue entre mayúsculas y minúsculas mientras coincide con "uby".

3

/R(?i:uby)/

Lo mismo que arriba.

4

/rub(?:y|le))/

Agrupar solo sin crear \ 1 referencia inversa.

Buscar y reemplazar

Algunos de los métodos String más importantes que utilizan expresiones regulares son sub y gsuby sus variantes in situ sub! y gsub!.

Todos estos métodos realizan una operación de búsqueda y reemplazo utilizando un patrón Regexp. lossub Y sub! reemplaza la primera aparición del patrón y gsub Y gsub! reemplaza todas las ocurrencias.

los sub y gsub devuelve una nueva cadena, dejando el original sin modificar donde como sub! y gsub! modificar la cadena en la que se llaman.

A continuación se muestra el ejemplo:

#!/usr/bin/ruby

phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
puts "Phone Num : #{phone}"

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"

Esto producirá el siguiente resultado:

Phone Num : 2004-959-559
Phone Num : 2004959559

A continuación se muestra otro ejemplo:

#!/usr/bin/ruby

text = "rails are rails, really good Ruby on Rails"

# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")

# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"

Esto producirá el siguiente resultado:

Rails are Rails, really good Ruby on Rails