Tracks
/
Elixir
Elixir
/
Temario
/
Expresiones regulares
Ex

Expresiones regulares en Elixir

24 ejercicios

Acerca de Expresiones regulares

Las expresiones regulares (regex) son una herramienta poderosa para trabajar con strings en Elixir. Las expresiones regulares en Elixir siguen la especificación PCRE (Expresiones Regulares Compatibles con Perl). Los patrones de string que representan el significado de la expresión regular se compilan primero y después se usan para hacer coincidir todo o parte de un string.

En Elixir, la forma más común de crear expresiones regulares es usar el sigil ~r. Los sigils proporcionan atajos de azúcar sintáctico para tareas comunes en Elixir. En este caso, ~r es un atajo para usar Regex.compile!/2.

Regex.compile!("test") == ~r/test/
# => true

El operador =~/2 es útil para hacer coincidir una regex con un string y devolver un resultado boolean.

"this is a test" =~ ~r/test/
# => true

Repaso de la sintaxis de regex

  • Algunos caracteres de un patrón de expresión regular tienen un significado especial; para usar el carácter de forma literal, hay que escaparlo con \, por ejemplo ~r/\?/.
  • Las clases de caracteres (por ejemplo \d, \w) permiten que los patrones coincidan con un rango de caracteres
  • Las alternancias (|) permiten que los patrones coincidan con un patrón u otro
  • Los cuantificadores ({N, M}, *, ?) permiten que los patrones coincidan con un número determinado de patrones repetidos
  • Los grupos (()) permiten que partes de un patrón funcionen como una unidad

Capturas

Las expresiones regulares también son útiles para extraer una parte de un string. A esto se le llama capturar. Para capturar una parte de un string, crea un grupo (()) para la parte que quieres capturar y usa Regex.run.

Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]

Las capturas se numeran (empezando en 1) y también se pueden usar en el resultado al reemplazar partes de un string con una expresión regular:

Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"

Las capturas también se pueden nombrar agregando ?<name> después del paréntesis de apertura. Usa Regex.named_captures/3 para obtener un mapa con las capturas con nombre.

Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}

Modificadores

El comportamiento de una expresión regular se puede modificar agregando flags especiales al final de la expresión regular, por ejemplo ~r/test/i.

  • caseless i - no distingue mayúsculas de minúsculas
    "A" =~ ~r/a/
    # => false
    "A" =~ ~r/a/i
    # => true
    
  • unicode u - habilita patrones específicos de Unicode como \p y hace que clases de caracteres como \w, etc. también coincidan con Unicode
    "ö" =~ ~r/^\w$/
    # => false
    "ö" =~ ~r/^\w$/u
    # => true
    
  • Y más: dotall, multiline, extended, firstline, ungreedy

Construir expresiones regulares de forma dinámica

Como el sigil ~r es un atajo para "pattern" |> Regex.escape() |> Regex.compile!(), también puedes usar interpolación de strings para construir de forma dinámica un patrón de expresión regular:

anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true

Expresiones regulares vs el módulo String

Aunque las expresiones regulares son poderosas, no siempre es prudente usarlas:

  • Se deben compilar antes de usarlas; esto consume tiempo de cómputo y memoria.
  • Pueden ser más lentas que usar funciones de string simples.

Como regla general, es mejor usar las funciones del módulo String siempre que sea posible.

# Don't use regular expressions to check a suffix:
if "YELLING!" =~ ~r/!$/, do: "Whoa, chill out!"

# Use a string function:
if String.ends_with?("YELLING!", "!"), do: "Whoa, chill out!"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Expresiones regulares

La práctica está bloqueada

Desbloquea 10 ejercicios más para practicar Expresiones regulares