Tracks
/
Elixir
Elixir
/
Lehrplan
/
Reguläre Ausdrücke
Re

Reguläre Ausdrücke in Elixir

24 Übungen

Über Reguläre Ausdrücke

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

Überblick über die Regex-Syntax

  • Einige Zeichen in einem regulären Ausdruck haben eine besondere Bedeutung. Um das Zeichen wörtlich zu verwenden, muss es mit \ maskiert werden, z. B. ~r/\?/.
  • Zeichenklassen (z. B. \d, \w) ermöglichen es Mustern, einen Bereich von Zeichen abzugleichen
  • Alternativen (|) ermöglichen es einem Muster, entweder das eine oder das andere Muster abzugleichen
  • Quantifizierer ({N, M}, *, ?) ermöglichen es Mustern, eine bestimmte Anzahl von Wiederholungen abzugleichen
  • Gruppen (()) lassen Teile eines Musters als eine Einheit fungieren

Captures

Regulä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"}

Modifikatoren

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
    
  • Und mehr: dotall, multiline, extended, firstline, ungreedy

Reguläre Ausdrücke dynamisch erstellen

Da 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

Reguläre Ausdrücke vs. das String-Modul

Obwohl reguläre Ausdrücke mächtig sind, ist es nicht immer ratsam, sie zu verwenden:

  • Sie müssen vor der Verwendung kompiliert werden, was Rechenzeit und Speicher kostet.
  • Sie können langsamer sein als einfache String-Funktionen.

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!"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Reguläre Ausdrücke

Das Üben ist gesperrt

Schalte 10 weitere Übungen frei, um Reguläre Ausdrücke zu üben