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
\, por ejemplo ~r/\?/.\d, \w) permiten que los patrones coincidan con un rango de caracteres|) permiten que los patrones coincidan con un patrón u otro{N, M}, *, ?) permiten que los patrones coincidan con un número determinado de patrones repetidos()) permiten que partes de un patrón funcionen como una unidadLas 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"}
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
dotall, multiline, extended, firstline, ungreedyComo 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
String
Aunque las expresiones regulares son poderosas, no siempre es prudente usarlas:
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!"