Reguläre Ausdrücke (Regex) sind ein mächtiges Werkzeug für die Arbeit mit Strings in Elixir. Reguläre Ausdrücke in Elixir folgen der PCRE-Spezifikation (Perl Compatible Regular Expressions). String-Muster, die die Bedeutung des regulären Ausdrucks darstellen, werden zuerst kompiliert und dann verwendet, um einen String ganz oder teilweise abzugleichen.
In Elixir werden reguläre Ausdrücke am häufigsten mit dem ~r-Sigil erstellt. Sigils bieten syntaktischen Zucker als Abkürzung für häufige Aufgaben in Elixir. In diesem Fall ist ~r eine Abkürzung für Regex.compile!/2.
Regex.compile!("test") == ~r/test/
# => true
Der Operator =~/2 ist nützlich, um einen String mit einem Regex abzugleichen und ein boolean-Ergebnis zu erhalten.
"this is a test" =~ ~r/test/
# => true
\ maskiert werden, z. B. ~r/\?/.\d, \w) ermöglichen es Mustern, einen Bereich von Zeichen abzugleichen|) ermöglichen es einem Muster, entweder das eine oder das andere Muster abzugleichen{N, M}, *, ?) ermöglichen es Mustern, eine bestimmte Anzahl von Wiederholungen abzugleichen()) lassen Teile eines Musters als eine Einheit fungierenReguläre Ausdrücke sind auch nützlich, um einen Teil eines Strings zu extrahieren. Man nennt das Erfassen. Um einen Teil eines Strings zu erfassen, erstelle eine Gruppe (()) für den Teil, den du erfassen möchtest, und verwende Regex.run.
Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]
Captures sind nummeriert (beginnend bei 1) und können auch im Ergebnis verwendet werden, wenn du Teile eines Strings mit einem regulären Ausdruck ersetzt:
Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"
Captures können auch benannt werden, indem du ?<name> nach der öffnenden Klammer anhängst. Verwende Regex.named_captures/3, um eine Map mit benannten Captures zu erhalten.
Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}
Das Verhalten eines regulären Ausdrucks lässt sich ändern, indem du spezielle Flags am Ende des regulären Ausdrucks anhängst, z. B. ~r/test/i.
caseless i - Groß-/Kleinschreibung wird nicht beachtet
"A" =~ ~r/a/
# => false
"A" =~ ~r/a/i
# => true
unicode u - aktiviert Unicode-spezifische Muster wie \p und bewirkt, dass Zeichenklassen wie \w usw. auch auf Unicode zutreffen
"ö" =~ ~r/^\w$/
# => false
"ö" =~ ~r/^\w$/u
# => true
dotall, multiline, extended, firstline, ungreedyDa das ~r-Sigil eine Abkürzung für "pattern" |> Regex.escape() |> Regex.compile!() ist, kannst du auch String-Interpolation verwenden, um ein Muster für einen regulären Ausdruck dynamisch zu erstellen:
anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true
String-ModulObwohl reguläre Ausdrücke mächtig sind, ist es nicht immer ratsam, sie zu verwenden:
Als Faustregel gilt: Verwende nach Möglichkeit die Funktionen aus dem String-Modul.
# 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!"