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-Key: 324426

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

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

Member: rubberman
Solution rubberman Dec 21, 2016 updated at 10:57:46 (UTC)
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
Member: emeriks
emeriks Dec 21, 2016 updated at 11:13:26 (UTC)
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?"
Member: rubberman
rubberman Dec 21, 2016 at 11:28:14 (UTC)
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
Mitglied: 131381
131381 Dec 21, 2016 updated at 11:46:19 (UTC)
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
Member: emeriks
emeriks Dec 21, 2016 at 11:57:07 (UTC)
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.
Mitglied: 131381
Solution 131381 Dec 21, 2016 updated at 12:10:10 (UTC)
Goto Top
Dann ersetze im Replace das Plus durch das Sternchen
.....Replace("\*", ".+")
in diesen
.....Replace("\*", ".*")
Member: emeriks
emeriks Dec 21, 2016 at 12:21:56 (UTC)
Goto Top
Danke, dass geht!
Member: AnkhMorpork
AnkhMorpork Dec 22, 2016 at 07:49:07 (UTC)
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>