Les expressions régulières (regex) sont un outil puissant pour manipuler les strings en Elixir. En Elixir, les expressions régulières suivent la spécification PCRE (Perl Compatible Regular Expressions). Les motifs sous forme de string qui représentent la signification de l'expression régulière sont d'abord compilés, puis utilisés pour faire correspondre tout ou partie d'une string.
En Elixir, la façon la plus courante de créer des expressions régulières est d'utiliser le sigil ~r. Les sigils offrent un sucre syntaxique sous forme de raccourcis pour des tâches courantes en Elixir. Ici, ~r est un raccourci pour Regex.compile!/2.
Regex.compile!("test") == ~r/test/
# => true
L'opérateur =~/2 permet de tester une string contre une expression régulière et de renvoyer un résultat boolean.
"this is a test" =~ ~r/test/
# => true
\, par exemple ~r/\?/.\d, \w) permettent à un motif de correspondre à une plage de caractères|) permettent à un motif de correspondre à un motif ou à un autre{N, M}, *, ?) permettent à un motif de correspondre à un nombre donné de répétitions()) permettent à certaines parties d'un motif de fonctionner comme une unitéLes expressions régulières servent aussi à extraire une partie d'une string. On parle alors de capture. Pour capturer une partie d'une string, crée un groupe (()) autour de la partie à capturer, puis utilise Regex.run.
Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]
Les captures sont numérotées (à partir de 1) et peuvent aussi être utilisées dans le résultat lorsqu'on remplace des parties d'une string à l'aide d'une expression régulière :
Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"
On peut également nommer les captures en ajoutant ?<name> après la parenthèse ouvrante. Utilise Regex.named_captures/3 pour récupérer une map contenant les captures nommées.
Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}
On peut modifier le comportement d'une expression régulière en ajoutant des options spéciales à la fin de l'expression régulière, par exemple ~r/test/i.
caseless i : insensible à la casse
"A" =~ ~r/a/
# => false
"A" =~ ~r/a/i
# => true
unicode u : active les motifs propres à Unicode comme \p et fait en sorte que les classes de caractères comme \w, etc. correspondent aussi aux caractères Unicode
"ö" =~ ~r/^\w$/
# => false
"ö" =~ ~r/^\w$/u
# => true
dotall, multiline, extended, firstline, ungreedyComme le sigil ~r est un raccourci pour "pattern" |> Regex.escape() |> Regex.compile!(), tu peux aussi utiliser l'interpolation de chaîne pour construire dynamiquement un motif d'expression régulière :
anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true
String
Bien que les expressions régulières soient puissantes, il n'est pas toujours sage de les utiliser :
En règle générale, mieux vaut utiliser les fonctions du module String chaque fois que c'est possible.
# 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!"