emeriks
Goto Top

VB.Net - Hilfe bei Regex

Hi,
vorne weg: Ich weiß, im Web gibt's zig Beispiele. Ich habe heute auch schon gesucht, aber abgebrochen, weil ich entweder den Wald vor lauter Bäumen nicht sehe oder schlicht weg keine Geduld beim Suchen habe. (Man kann auch sagen "zu faul bin" face-wink)

Ich will Wildcard-Suchen umsetzen. Die gegebenen Suchstrings haben dabei als Wildcard immer und nur das "*"-Zeichen.
Beispiele:
Heute*
*ist*
*Tag
Heute*ein*Tag
Heute*regnet*

Jetzt muss ich prüfen, ob ein gegebener Text einem gegebenen Suchstring entspricht. (Groß/Kleinschreibung egal - das wird vorher alles in Kleinbuchstaben umgewandelt)
Text: "Heute ist ein schöner Tag."
Heute* --> Wahr
*Heute* --> Wahr
*ist* --> Wahr
*Tag --> Falsch (wegen Punkt am Ende des Text)
Heute*ein*Tag. -->Wahr
Heute*regnet* --> Falsch

Meine Idee ist jetzt, das "*" durch die entsprechenden Regex-Strings zu ersetzen und dann mit Regex.IsMatch zu prüfen.
Wenn ich richtig liege dann muss ich "*" durch ".+" ersetzen.
Das klappt solange, wie das "*" nicht am Anfang steht. "*Heute*" soll z.B. auch Wahr ergeben. ".+Heute.+" liefert aber Falsch.
"*Tag" soll Falsch ergeben, "*Tag." Wahr. (beachte den Punkt am Ende) --> "*Tag" als ".+Tag" liefert aber Wahr?

Wie muss ich das angehen? (gerne auch mit Holzhammer face-wink)

E.

Content-ID: 324426

Url: https://administrator.de/forum/vb-net-hilfe-bei-regex-324426.html

Ausgedruckt am: 06.04.2025 um 21:04 Uhr

rubberman
Lösung rubberman 21.12.2016 aktualisiert um 11:57:46 Uhr
Goto Top
Hallo emeriks.

Genau habe ich dein Problem nicht verstanden. Wie auch immer.
"." ist jedes beliebige Zeichen.
"+" steht für muss mindestens einmal vorkommen.
"*" stünde für darf entweder nicht, ein- oder mehrfach vorkommen.
Wenn du einen Punkt als Literal matchen willst, dann musst du ihn mit Backslash maskieren "\."
Wenn du also so etwas wie alles außer Punkt matchen willst, wäre das "[^\.]" wobei du dort "+" oder "*" ebenso hinter der eckigen Klammer anhängen kannst.

Grüße
rubberman
emeriks
emeriks 21.12.2016 aktualisiert um 12:13:26 Uhr
Goto Top
@rubberman
Danke erstmal.
Genau habe ich dein Problem nicht verstanden.
Ich habe Texte gegeben. (Einzeiler, ohne Zeilenumbruch)
Ich habe Suchstrings gegeben. Diese verwenden "*" als Platzhalter/Wildcard für "irgendwas".
"*" kann am Anfang und/oder mehrmals mittendrin und/oder am Ende des Suchstrings positioniert sein.
Diese Suchstrings will ich nun in Regex-Ausdrücke umwandeln, damit ich suchen kann: "Entspricht der Text dem Suchstring?"
rubberman
rubberman 21.12.2016 um 12:28:14 Uhr
Goto Top
Die Logik erschließt sich mir einfach noch nicht face-wink
*Tag --> Falsch (wegen Punkt am Ende des Text)
Nanu?

Aber noch mal. Tut es ein "[\.]*" statt ".+" für deinen Fall?

rubberman
131381
131381 21.12.2016 aktualisiert um 12:46:19 Uhr
Goto Top
Hi
ich habe das jetzt so interpretiert, wenn das Sternchen immer "mindestens ein Zeichen" bedeuten soll.

Ein "Imports System.Text.RegularExpressions" für den Code in der Klasse vorausgesetzt.
Dim txt As String = "Heute ist ein schöner Tag."  
Dim simplePatterns() As String = {"Heute*", "*Heute*", "*ist*", "*Tag"}  
For Each pattern In simplePatterns
    Dim regexString As String = "^" & Regex.Escape(pattern).Replace("\*", ".+") & "$"  
    If (New Regex(regexString,RegexOptions.IgnoreCase).IsMatch(txt)) Then
        MsgBox("Simple Pattern: '" & pattern & "' trifft zu.")  
    End If
Next
Das zusätzliche Regex-Escaping deswegen weil ja noch andere spezielle Regex-Zeichen im String vorkommen könnten.

Gruß mik
emeriks
emeriks 21.12.2016 um 12:57:07 Uhr
Goto Top
@131381
Danke, das ist schon nah dran.
ich habe das jetzt so interpretiert, wenn das Sternchen immer "mindestens ein Zeichen" bedeuten soll.
Sorry, habe ich nicht genau geschrieben. "*" steht für "nichts" oder "irgendwas".
"*Heute*" soll also genauso Wahr sein wie "Heute*"
ebenso
"*Tag.*" soll also genauso Wahr sein wie "*Tag."

Danke für Eure Mühe.
131381
Lösung 131381 21.12.2016 aktualisiert um 13:10:10 Uhr
Goto Top
Dann ersetze im Replace das Plus durch das Sternchen
.....Replace("\*", ".+")
in diesen
.....Replace("\*", ".*")
emeriks
emeriks 21.12.2016 um 13:21:56 Uhr
Goto Top
Danke, dass geht!
AnkhMorpork
AnkhMorpork 22.12.2016 um 08:49:07 Uhr
Goto Top
<OT>
A coworker, when describing regular expressions, once said, “Whoever created regular expressions had to be on drugs.” This couldn’t be more truthful.

Quelle: http://blog.pluralsight.com/powershell-operators-like-match

</OT>