einzelne Wörter aus einem String Filtern und ausgeben/speichern - mittels LINQ und Regex (gerne auch eine andere Lösung)

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    einzelne Wörter aus einem String Filtern und ausgeben/speichern - mittels LINQ und Regex (gerne auch eine andere Lösung)

    Hallo zusammen,

    bisher konnte ich als stille Mitleserin all meine Probleme in diesem wirklich tollen Forum finden. Leider kam jetzt aber ein Problem auf, zudem ich keine Lösung finden konnte.

    Ich arbeite seit einiger Zeit an einem Programm zur Auslesung von einem String innerhalb eines Strings. Es soll ein Benutzername aus einem Textblock ausgelesen werden, welcher noch andere Informationen beinhaltet. Ein Beispiel Benutzername wäre: "max.mustermann" (ohne Gänsefüßchen).
    Es wird zunächst ein großer Textblock eingegeben, welcher nach jedem Zeilenumbruch gesplittet wird. Der gesplittete Textblock wird in einem (String) Array gespeichert. Bisher hatte ich das Ganze mit InStr gelöst (ich hänge meine bisherige Lösung hier gleich an). Jedoch würde ich gerne wissen, ob ich das Ganze auch per Where Klausel in Kombination mit Regex lösen kann. Dazu hatte ich bereits ein wenig daran gearbeitet, finde allerdings keine Lösung, wie ich nach dem Suchen (Where) des passenden Elements auch das Element bearbeiten und anhand des Regex Ausdrucks filtern kann (dann der Select Teil?). Die bisherige Lösung setzt leider die Zeichen vor und nach dem Benutzernamen als Eingabe voraus, welche allerdings nicht in jeder Eingabe vorhanden sind. Daher meine Frage, kann man das Programm auch einfach danach richten, dass es den Benutzernamen erkennt und ihn direkt rausfiltert?

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Dim arrStrGesplittet As String()
    4. Dim strRegEx As String = "[a-z]+[.]{1}[a-z]+"
    5. Dim regExKriterium As Regex = New Regex(strRegEx)
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. arrStrGesplittet = stringSplitten(TextBox1.Text)
    8. TextBox2.Text = testFiltern(arrStrGesplittet)
    9. End Sub
    10. 'Folgendes noch als eigenes Modul machen!
    11. Function testFiltern(text As String()) As String
    12. 'Filtern des Strings für ein Element im Text, wo RegEx gilt, soll er das Element auswählen und in query speichern
    13. Dim query = From x In text Where (regExKriterium.IsMatch(x)) Select x
    14. 'String erstellen mit dem Stringbuilder (query ist kein String)
    15. Dim strBuild As New System.Text.StringBuilder()
    16. 'auslesen aller gefilterten Elemente der query und einpflegen in den Stringbuilder
    17. For Each y As String In query
    18. strBuild.AppendLine(y)
    19. Next
    20. MsgBox(strBuild.ToString())
    21. 'Muss aus irgendwelchen Gründen als String Convertiert werden
    22. Return strBuild.ToString()
    23. End Function
    24. Public Function stringSplitten(text As String) As String()
    25. Dim arrX = Split(text, vbNewLine)
    26. Return arrX
    27. End Function
    28. End Class


    Ich hab meine Kommentare mal mit dran gelassen. Hauptsächlich geht es mir um folgende Zeile

    VB.NET-Quellcode

    1. Dim query = From x In text Where (regExKriterium.IsMatch(x)) Select x


    Mir ist bewusst, dass derzeit nur der String/Array Eintrag ausgegeben wird, in welchem der Reguläre Ausdruck greift. Was muss ich am Select verändern, dass auch wirklich nur der Benutzername herauskommt?


    Meine bisherige Mustereingabe sieht folgendermaßen aus:

    Quellcode

    1. Typ Zustand Name
    2. Benutzer Mustermann, Max (Server-name\max.mustermann)
    3. Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
    4. Benutzer Doe, Jane (Server-name\jane.doe)
    5. Benutzer Svensson, Kalle (Server-name\kalle.svensson)
    6. Benutzer Borg, Joe (Server-name\joe.borg)


    Und wenn ich das in den Code oben einfüge, kommt folgendes als Ausgabe heraus:

    Quellcode

    1. Benutzer Mustermann, Max (Server-name\max.mustermann)
    2. Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
    3. Benutzer Doe, Jane (Server-name\jane.doe)
    4. Benutzer Svensson, Kalle (Server-name\kalle.svensson)
    5. Benutzer Borg, Joe (Server-name\joe.borg)


    Ich bin gespannt ob jemand einen Ansatz für die Lösung hat und mir helfen kann.

    Viele Grüße
    Misao

    Misao_96 schrieb:

    Was muss ich am Select verändern, dass auch wirklich nur der Benutzername herauskommt?
    ich denke, am Regex musste was verändern, nicht am Select.
    Allerdings kann ich das nicht genauer angeben, weil ich weiss nicht, was herauskommen soll. Mit "wirklich nur der Benutzername" kann ja alles gemeint sein.
    Am besten du gibst noch mit an, was ganz konkret bei der gegebenen Eingabe rausskommen soll.

    Neu

    ) entfernen
    beim \ Splitten,
    und dann das letzte Ergebnis des daraus herauskommenden Arrays verwenden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Neu

    Wenn du nicht zwingend auf die einzelnen Zeilen angewiesen bist könntest du das ganze einfach umdrehen. Also mit Regex alle Benutzernamen suchen und aus der MatchCollection mit Linq die Benutzernamen holen.

    C#-Quellcode

    1. string[] userNames = Regex.Matches(inputString, @"\\(?<name>\w+\.\w+)\)", RegexOptions.Singleline).Cast<Match>().Select(x => x.Groups["name"].Value).ToArray();

    Neu

    Hi,
    ich abe dies als Textdatei mit namen "E:\MisaoData.txt" angelegt

    VB.NET-Quellcode

    1. Typ Zustand Name
    2. Benutzer Mustermann, Max (Server-name\max.mustermann)
    3. Benutzer Normalverbraucher, Otto (Server-name\otto.normalverbraucher)
    4. Benutzer Doe, Jane (Server-name\jane.doe)
    5. Benutzer Svensson, Kalle (Server-name\kalle.svensson)
    6. Benutzer Borg, Joe (Server-name\joe.borg)


    dann mit Regex filtern und ergebnisse in eine neue Textdatei schreiben

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Using Writer As New System.IO.StreamWriter("E:\ExtractedData.txt") '<--gefunden in Datei schreiben
    3. For Each Match As System.Text.RegularExpressions.Match In _
    4. System.Text.RegularExpressions.Regex.Matches _
    5. (My.Computer.FileSystem.ReadAllText("E:\MisaoData.txt"), "\\(.*?)\)", RegexOptions.IgnoreCase)
    6. Writer.WriteLine(Match.Groups(1))
    7. ListBox1.Items.Add(Match.Groups(1))
    8. MessageBox.Show("Data :" & Match.Groups(1).ToString & " gefunden!")
    9. Next
    10. End Using
    11. End Sub