Las expresiones regulares (regex) son una herramienta muy potente para trabajar con strings en Elixir. Las expresiones regulares de Elixir siguen la especificación PCRE (Perl Compatible Regular Expressions). Los patrones de string que representan el significado de la expresión regular se compilan primero y después se usan para buscar coincidencias con todo un string o con una parte de él.
En Elixir, la forma más habitual 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 buscar una coincidencia de una expresión regular en un string y obtener un resultado boolean.
"this is a test" =~ ~r/test/
# => true
\, p. ej. ~r/\?/.\d, \w) permiten que un patrón coincida con un rango de caracteres|) permiten que un patrón coincida con un patrón u otro{N, M}, *, ?) permiten que un patrón coincida con un número determinado de repeticiones()) 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 captura. 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 están numeradas (empezando por 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 añadiendo ?<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 añadiendo modificadores especiales al final de la expresión regular, p. ej. ~r/test/i.
caseless i - no distingue mayúsculas y minúsculas
"A" =~ ~r/a/
# => false
"A" =~ ~r/a/i
# => true
unicode u - habilita patrones específicos de Unicode como \p y hace que las clases de caracteres como \w, etc. también coincidan con caracteres 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 la interpolación de string para construir dinámicamente 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 potentes, no siempre es aconsejable usarlas:
Como norma 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!"