emeriks
Goto Top

VB.Net - RegEx - String enthält NICHT ein bestimmtes Wort

Hi,
RegEx ist nicht meine Stärke.

Ich will in einem meiner Programme benutzerdefinierte Textfilter einbauen. Die Benutzer sollen u.a. auch per RegEx Listen filtern können.
Nun teste ich selbst gerade damit und bin auf eine Anforderung gestoßen, welche ich mit meinen bescheidenen RegEx-Kenntnissen nicht auf die Reihe bekomme.

Ich will z.B., dass Strings überprüft werden, ob sie folgendem Schema entsprechen: Enthält "Hallo" und "Welt" aber nicht "falsch".

Mein Versuch:
Hallo.*Welt.*(?!falsch).*

Wenn ich den String "Hallo schöne Welt! Das ist ein falsches Wort." damit teste, bekomme ich ein Match.
Wenn ich "Hallo schöne Welt! Das ist ein Wort." damit teste, bekomme ich auch ein Match.


Wie muss ich sowas anstellen?

E.

Dim Rx As Regex = New Regex("Hallo.*Welt.*(?!falsch).*")  
Dim M As Match = Rx.Match("Hallo schöne Welt! Das ist ein falsches Wort.")  

MsgBox(M.Success)

Content-Key: 498606

Url: https://administrator.de/contentid/498606

Printed on: April 16, 2024 at 19:04 o'clock

Mitglied: 140913
140913 Sep 26, 2019 updated at 09:53:41 (UTC)
Goto Top
Das geht mit den Zero Length Assertions und .* die du hier so nutzt nicht. Teile das ganze auf und zwar den Teil den du positiv matchen willst und den Teil der nicht enthalten sein soll.
Also zuerst ein Match der Worte die enthalten sein sollten mit einem Regex und danach ein weiterer Match der alle Sachen matcht die nicht enthalten sein dürfen mit
^((?!falsch).)*$
z.B. dieser ist nur positiv wenn der entsprechende Pattern (hier "falsch") nicht enthalten ist.

screenshot

Am Ende vergleichst du beide Teile auf einen Match und gibst nur dann positive Rückmeldung wenn beide Teile positiv ausgefallen sind. Das lässt sich ja bei Bedarf auch über Arrays auf mehr Strings ausweiten.
Member: emeriks
emeriks Sep 26, 2019 at 09:43:28 (UTC)
Goto Top
Zitat von @140913:
Hm, ja ok, so könnte ich das als Programmierer prüfen.

Ich will dem Benutzer aber nur eine Textzeile anbieten, wo er seinen RegEx reinschreiben kann. Ich kann dann also nur diesen eine Ausdruck einmal prüfen.
Wenn ich Dich richtig verstanden habe, wäre dann die von mir genannte konkrete Anforderung so für den Benutzer nicht umsetzbar?
Mitglied: 140913
Solution 140913 Sep 26, 2019 updated at 10:01:30 (UTC)
Goto Top
Muss mich korrigieren (brett vor kopf klatsch). Habe gerade nochmal geprüft, wäre doch folgendermaßen machbar indem man den Negative Lookahead als erstes nutzt, denn dann geht der Regex-Parser bei einem negativen Ergebnis des Lookahaead erst gar nicht weiter im Kontext:
(?!.*falsch).*Hallo.*Welt.*

screenshot

Hier sieht man es schön wie der Parser das ganze aufrollt (für das Beispiel der ersten Zeile):

screenshot
Member: emeriks
emeriks Sep 26, 2019 at 10:06:28 (UTC)
Goto Top
Zitat von @140913:
Muss mich korrigieren (brett vor kopf klatsch).
Also, komm, ja ! face-wink face-smile

Danke für Deine Mühe!
Das geht so!