String Liste durchsuchen, mit Platzhalter

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    String Liste durchsuchen, mit Platzhalter

    Hallo, gibt es eine fertige Funktion, die ich benutzen kann um folgendes zu tun, oder müsste ich das selber machen?

    Ich habe eine Liste mit Namen. Als Beispiel jetzt mal folgende:
    1. MARIO MAYER
    2. MARIO MEYER
    3. MARIO MAIER
    4. MARIO MECKE
    5. MARIO MECKER
    Diese Liste würde ich jetzt gerne durchsuchen zum Beispiel nach "MA*** M****"
    Als Ergebnis möchte ich nur die Nummer 2 und die Nummer 4 erhalten.
    Die Nummer 5 soll nicht angezeigt werden, da sie 1 Buchstaben mehr als der gesuchte String enthält.
    Die Nummer 1 und 3 soll nicht angezeigt werden, weil ich im gesuchten String die Buchstaben "M" und "A" verwende. Das heißt diese beiden dürften nur an den vorgegebenen Stellen auftreten. Wenn das "A" wie im Beispiel 1 und 3 noch an einer weiteren Stelle auftritt, scheidet dieser String als Ergebnis aus.
    Ich hoffe ich habe mich verständlich ausgedrückt.
    Ich hatte das vor ca. 12. Jahren mal programmiert und was würde auch jetzt noch so funktionieren. Die Frage bezieht sich halt drauf es besser / einfacher zu programmieren.
    @Humax Ds sieht sehr nach RegEx aus.
    Dazu findste hier im Forum beliebig viele Beispiele.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Humax schrieb:

    Diese Liste würde ich jetzt gerne durchsuchen zum Beispiel nach "MA*** M****"
    Bei so einfachen Mustern kannst du auch ich den LIKE Operator verwenden.
    Also

    VB.NET-Quellcode

    1. If Record Like "MA??? M????" Then
    oder ggf. auch

    VB.NET-Quellcode

    1. If Record.ToUpper Like "MA* M*" Then
    je nachdem, was in deinem Fall sinnvoll ist.
    Das ToUpper verwendest du, wenn du case insensitiv suchen willst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke. Like werde ich mir angucken, aber auf den ersten Blick sieht es zwar einfach aus, aber auch als ob dein Beispiel Code mir mehr als Ergebnis anzeigen würde als ich will.
    Regex scheint mir mächtig zu sein, aber auch kompliziert und irgendwie habe ich für mein Anwendungszweck keine Lösung gefunden. Ich werde es mir nochmal angucken.

    Humax schrieb:

    aber auch als ob dein Beispiel Code mir mehr als Ergebnis anzeigen würde als ich will.
    Das erste Beispiel nicht, das entspricht genau deiner Vorgabe.
    Sonst nenne mir einen String, der angezeigt wird und nicht deinem Wunsch entspricht.

    Der zweite Ansatz soll dir zeigen, was sonst noch möglich wäre, wenn du den Filter etwas schwächer gestalten willst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ab die Antwort ist doch eigentlich richtig. Du möchtest 2 und 4 auslesen, wenn du nun:

    VB.NET-Quellcode

    1. If Record Like "MA??? M????" Then


    machst, zeigt er dir:
    MARIO MAYER
    MARIO MEYER
    MARIO MAIER
    MARIO MECKE

    an. Machst du aber:

    VB.NET-Quellcode

    1. If Record Like "MA??? ME???" Then


    zeigt er dir folgendes an (so wie du es willst):
    MARIO MEYER
    MARIO MECKE

    Am Ende könnte das dann so aussehen (lange kein VB mehr geschrieben):

    If line Like TextBox1.Text.Replace("*", "?") Then
    ListBox1.Add(line)

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

    Humax schrieb:

    welche Ergebnisse geliefert werden sollen und warum

    Na dann eben If Record Like "MA??? M[!A]???" Then
    In der Dokumentation zu LIKE sind alle mögliche Pattern gelistet.
    Kombiniere sie einfach so, dass es deinen Vorgaben entspricht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    CensoredAlpaca schrieb:

    Ab die Antwort ist doch eigentlich richtig. Du möchtest 2 und 4 auslesen, wenn du nun:

    VB.NET-Quellcode

    1. If Record Like "MA??? M????" Then


    machst, zeigt er dir:
    MARIO MAYER
    MARIO MEYER
    MARIO MAIER
    MARIO MECKE

    an. Machst du aber:

    VB.NET-Quellcode

    1. If Record Like "MA??? ME???" Then


    zeigt er dir folgendes an (so wie du es willst):
    MARIO MEYER
    MARIO MECKE

    Am Ende könnte das dann so aussehen (lange kein VB mehr geschrieben):

    If line Like TextBox1.Text.Replace("*", "?") Then
    ListBox1.Add(line)

    Nochmal nach meinen Vorgaben, darf er aber mit

    VB.NET-Quellcode

    1. If Record Like "MA??? ME???" Then
    die Einträge 2 und 4 nicht mehr anzeigen dürfen, da in 2 und 4 mehrere "E" vorhanden sind und ich als Ergebnis das nicht möchte.

    petaod schrieb:

    Humax schrieb:

    welche Ergebnisse geliefert werden sollen und warum

    Na dann eben If Record Like "MA??? M[!A]???" Then
    In der Dokumentation zu LIKE sind alle mögliche Pattern gelistet.
    Kombiniere sie einfach so, dass es deinen Vorgaben entspricht.

    Ja das kommt schon eher von, aber wie gesagt ich hatte noch keine Zeit mich damit zu beschäftigen. Mein Problem ist aber eher das das ja variabel sein soll. Wenn ich in gesuchten Text beispielsweise anstatt den bisher 2 nun 4 Buchstaben vorgebe, dann müsste immer der Suchttext in die einzelnen Buchstaben aufgeteilt werden. Ich glaube dass bringt jetzt nichts. Ich muss erst die Zeit haben noch damit zu beschäftigen.

    Humax schrieb:

    Mein Problem ist aber eher das das ja variabel sein soll
    Dann musst du halt das gewünschte Suchmuster in einer Variablen zusammen bauen.
    Aber in der Tat benötigst du erst einmal ein Konzept, das die Regeln vollständig beschreibt.
    Das lässt sich dann sicher völlig problemlos codieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, ich hab da schon eine Idee. Muss ich Mal probieren...
    Gedanke ist folgender:
    Meinen Suchstring "MA*** M****" würde ich dann in die einzelnen vorhandenen Buchstaben splitten. Hätte dann also "M" und "A". Und mein Suchstring würde ich dann neu zusammensetzen mit einer If -Abfrage in einer for next Schleife für die Anzahl der Zeichen in meinem Original Suchstring. In diesem Beispiel würde die Schleife also 10 Mal durchlaufen. Wenn das Zeichen ein "*" ist, dann würde ich im neuen Suchstring dann [!] Das Ausrufezeichen dann gefolgt von den ermittelten einzelnen Buchstaben ("M" und "A"). Und wenn es kein "*" ist dann wird das angegebene Zeichen verwendet.

    Könnte so funktionieren. Muss ich probieren
    So, habs mal probiert. Funktioniert mit dem like-Operator wunderbar.
    Danke.

    Hier mal mein (schnell getippter) Code.
    Wenn darin noch Verbesserungsvorschläge (programmiertechnisch - das Ergebnis passt ja !) auffallen, gerne her damit.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim liste As List(Of String) = New List(Of String) From {
    3. "MARIO MAYER",
    4. "MARIO MEYER",
    5. "MARIO MAIER",
    6. "MARIO MECKE",
    7. "MARIO MECKER"
    8. }
    9. Dim Suchtext As String = "M**** M**e*"
    10. Dim Ausnahme As String = String.Empty
    11. Dim Suchtext2 As String = String.Empty
    12. For Each bst As Char In Suchtext
    13. If Not bst = "*" Then
    14. If Not Ausnahme.Contains(bst.ToString.ToUpper) Then
    15. Ausnahme += (bst.ToString.ToUpper)
    16. End If
    17. End If
    18. Next
    19. For a As Integer = 0 To Suchtext.Length - 1
    20. If Suchtext.Substring(a, 1) = "*" Then
    21. Suchtext2 += "[!" & Ausnahme & "]"
    22. Else
    23. Suchtext2 += Suchtext.Substring(a, 1).ToUpper
    24. End If
    25. Next
    26. Dim ergebnis As List(Of String) = New List(Of String)
    27. For a As Integer = 0 To liste.Count - 1
    28. If liste(a).ToUpper Like Suchtext2 Then
    29. ergebnis.Add(liste(a).ToUpper)
    30. End If
    31. Next
    32. End Sub