RegEx Verständnis Problem

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    RegEx Verständnis Problem

    Hi,
    ich bastel gerade an einer Suchen&Ersetzen Funktion.
    Dazu hab ich 2 Probleme.

    Das Suchen und auch das Ersetzen einzelner Funde oder aller Funde klappt hervorragend.
    Allerdings möchte ich dem User die Möglichkeit bieten, mit einem Button durch die Gefundenen Matches zu "hüpfen".
    Dazu habe ich folgenden Code geschrieben:

    VB.NET-Quellcode

    1. <Extension>
    2. Public Sub SelectNext(ByVal rtb As RichTextBox, search As String)
    3. Dim pattern As String = "\b" & search & "\b"
    4. Dim r As Regex = New Regex(pattern, RegexOptions.IgnoreCase)
    5. Dim m As Match = r.Match(rtb.Text)
    6. rtb.Select(m.Index, m.Length)
    7. m = m.NextMatch
    8. End Sub

    Ich möchte quasi, wenn ich einen Button drücke, das er bei jedem Klick das Nächste gefundene Selectiert... Leider klappt dies so nicht. Ich hab schon einiges versucht, auch mit Schleifen usw. aber es wird immer nur das letzte gefundene Selectiert.
    Das gesuchte markiere ich so:

    VB.NET-Quellcode

    1. <Extension>
    2. Public Sub FindMatch(ByVal rtb As RichTextBox, ByVal search As String)
    3. Dim matchCol As MatchCollection
    4. Dim pattern As String = "\b" & search
    5. matchCol = Regex.Matches(rtb.Text, pattern, RegexOptions.IgnoreCase)
    6. For i As Integer = 0 To matchCol.Count - 1
    7. With rtb
    8. .Select(matchCol(i).Index, matchCol(i).Value.Length)
    9. .SelectionColor = Color.Blue
    10. .SelectionBackColor = Color.DarkOrange
    11. End With
    12. Next
    13. End Sub

    wie kann ich quasi durch die gefundenen durchhüfen?
    2. Frage:
    das Pattern "\b" & search soll immer nur ganze Wörter finden. Da ich die Sub aber im TextChanged Event aufrufe, findet es auch Buchstaben, die mit dem Suchwort beginnen. Wie kann ich nur ganze Wörter finden.
    Beispiel:
    Ich tippe n ein, gefunden werden sollen alle Wörter, die mit n beginnen, die suche soll verfeinert werden je mehr Buchstaben ich eingebe.
    Hätte da jemand nen Tip für mich?
    Danke Euch
    "Hier könnte Ihre Werbung stehen..."
    Also um nur nach Wörter zu suchen einfach hinten und vorne dran dran [\s|\n|\r\n|$|\.|;|"|\?|,]. Fürs erstetzen dann aber aufpassen das Zeichen muss ja wieder übernommen werden.

    Edit: oh Satzzeichen vergessen...

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Hmmm, funktioniert nicht anders wie "\b"...
    das gefundene Wort wird erst komplett markiert, wenn es komplett geschrieben wurde. Wenn ich noch "\b" ans ende hänge, wird es erst dann markiert wenn es vollständig geschrieben wurde.
    Ich möchte ja quasi das wenn ich zum Beispiel in folgendem Text suche:
    Public Sub SetNewPassword() Using Connect = New PrincipalContext(ContextType.Domain, mDomain, mBaseDN), usrSearch = New PrincipalSearcher(New UserPrincipal(Connect)) For Each usr As UserPrincipal In usrSearch.FindAll() Dim pw As String = CreatePassword(10) usr.Description = pw usr.SetPassword(pw) usr.Save() Next End Using End Sub
    suche nach "us" dann soll alles was mit us beginnt markiert werden, tippe ich dann wieder nen Buchstaben, z.Bsp. i dann nur noch die, die usi heißen.
    Wenn das nicht geht, geb ich mich auch mit "\b" zufrieden :)
    "Hier könnte Ihre Werbung stehen..."
    Ja, wollte ich eigentlich auch.
    Zum Beispiel, ich gebe mes ein, dann sollen alle Wörter die mit mes anfangen markiert werden. (zum Beispiel MessageBox)
    Im Moment funktioniert es so, das ich M eingebe und er alle Wörter findet, die mit M anfangen, aber nicht komplett markiert, sondern nur das M.
    Erst wenn ich messagbox eingebe, wird das ganze wort markiert.
    Ich vermute es liegt eher an dem .Select(match.Index, match.Length)

    EDIT:
    Kommando zurück. Die Suche funktioniert analog der internen Suche von Visual Studio.

    2 Schönheitsfehler hab ich allerdings noch. wenn ich die eingegeben Zeichen lösche, soll auch die Markierung wieder aufgehoben werden.
    Wie funktioniert das?
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()