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
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)
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
Wie müsste man es denn abändern, wenn man in deinem Beispiel alle Sätze findet, die nicht exakt 4 Leerzeichen haben?
oder anders gefragt: Wenn ich eine durch Semikolon getrennte CSV Datei hab und in der Regel 4 Spalten (3 Semikolons) habe und ich möchte genau die Zeilen angezeigt bekommen, in denen es entweder mehr oder weniger sind?
Wenn ich also den Ausdruck ^.*;.*;.*;.*$ negieren möchte.
Hi,
am besten mit RegEx überhaupt nicht, dafür gibt’s viel bessere Methoden. Mit so ziemlich jeder Programmiersprache kann man ganz schnell prüfen, wie oft ein bestimmtes Zeichen in einem Text vorkommt, RegEx würde ich dafür wirklich nicht benutzen 😉
VG
Marius