[Lösung] RegEx – Wort darf nicht vorkommen

Hi,

ich hab im Internet ewig gesucht nach RegEx-Pattern mit denen es mir -in einem Einzeiler- möglich ist, Strings zu finden, unter der Voraussetzung dass Wörter nicht gefunden werden. Nach einigem Rumprobieren hab ich ne Lösung gefunden.
Als Beispiel habe ich folgenden Text (Source):

Das ist kurzer Text
Das ist ein langer Text
Das ist ein toller Text
Das ist ein langweiliger Text

Jetzt möchte ich beisp. dass gesucht wird ab dem Wort „Das“ bishin zu „Text“, aber nur, wenn dazwischen nirgends „toll“ vorkommt.

Von der ersten Zeile mal abgesehen könnte man es noch mit Lookaround-Assertions (mehr dazu) lösen, weil der Text vor dem Eigenschaftswort (also „langer“, „toller“ und „langweiliger“) immer gleich ist, aber wenn das nicht mehr so ist haben wir ein Problem – wie in der ersten Zeile (weil ja dort das Wort „ein“ nicht vorkommt).

An dem Punkt hab ich auch im Internet nichts gescheites mehr gefunden – zumindest nichts was sich in einem einzigen Pattern hätte lösen lassen. Also hab ich umgedacht und mir ist tatsächlich was tolles eingefallen!

+++ Lösung / Solution +++

Anhand des oberen Beispiels – so klappts:
das (?!.*?(toll)).*?text

Es können auch mehrere Wörter angegeben, die nicht vorkommen dürfen. Beispiel:
das (?!.*?(toll|kurz)).*?text
Das findet somit nur noch die 2. und 4. Zeile.

Bei mir hab ich’s mit den Modifiern „g“ (global, also nicht nur das erste Vorkommen) und „i“ (Groß-/Kleinschreibung ignorieren) gemacht.

Beste Grüße
Marius

2 Gedanken zu „[Lösung] RegEx – Wort darf nicht vorkommen“

  1. Danke!
    … die „?“ nach dem „.*“ sind, meines Erachtens, nicht nötig.
    „.*“ schließt auch die 0-malige Wiederholung (hier: eines beliebigen Zeichens „.“) mit ein
    Also: Das(?!.*(toll)).*Text müsste auch funktionieren
    (ich hab’s aber nicht vollständig getestet)

    Antworten
    • Hi,

      ja es geht auch ohne das Fragezeichen. Das Fragezeichen hat hier die Funktion, den „.*“ quantifier zu beschränken damit er nicht so gierig ist. Mit „.*?Text“ will ich dass alles gefunden wird bis zum ersten Vorkommen von „Text“, im Gegensatz dazu würde „.*Text“ gierig sein und alles matchen bis zum letzten Vorkommen von „Text“ – hier ein Beispiel: https://regex101.com/r/Cs2Do9/1 und https://regex101.com/r/uCq9Cr/1

      Grüße
      Marius

      Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.