Bestimmte Werte aus Textdatei filtern - RegEx Problem

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Link.

    Bestimmte Werte aus Textdatei filtern - RegEx Problem

    Hallo zusammen,

    war bisher nur stiller Mitleser und habe mich frisch registriert.

    Ich möchte aus relativ großen Textdateien bestimmte Werte auslesen: alles, was mit 02 A1 beginnt und mit 03 endet, ist für mich relevant.

    Da möchte ich dann die ersten beiden Zeichen nach 02 A1 (Leerzeichen ausgeschlossen), und die Zeichen 11-14 rausfiltern und entsprechend in einer Textbox anzeigen.

    Hier mal Beispiel-Ausschnitt aus der Textdatei:

    VB.NET-Quellcode

    1. AA EE FF DD AA EE FE 02 A1 71 F0 FF FF 00 90 AA 03 02 A1 03 02 A1 03 FF FF FF FF EE DD AF FF
    2. 02 A1 03
    3. EE FF DD AA 02 A1 71 F0 FF FF 00 92 AA 03 02 A1 03 02 A1 03 FD FD CC
    4. 02 A1 03
    5. 02 A1 71 F0 FF FF 00 94 AA 03 02 A1 03 02 A1 03
    6. 02 A1 03


    Die Zeilenumbrüche und Leerzeilen hab ich nicht entfernt, weil das in der echten Datei zu viel Aufwand wäre.

    Von diesem Textbeispiel würde ich also folgendes erhalten wollen:
    71( )90( )AA
    71( )92( )AA

    Mein RegEx-Code sieht aktuell so aus:

    VB.NET-Quellcode

    1. Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    2. Dim inpst As String = RichTextBox2.Text
    3. Dim regextst As Regex = New Regex("A1 \S+.{22,30}?03", RegexOptions.Multiline Or RegexOptions.Singleline Or RegexOptions.CultureInvariant Or RegexOptions.Compiled)
    4. Dim regmatch As MatchCollection = regextst.Matches(inpst)
    5. For Each m As Match In regmatch
    6. txtBx.Text &= m.Value
    7. Next
    8. txtBx.Text = txtBx.Text.Replace(ControlChars.Lf, "") 'test
    9. End Sub


    Die Textdatei lade ich in die RichTextBox2, das Ergebnis soll in der txtBx-Textbox landen.

    So, nun mein Probleme:

    1. Es sind zwischen 02 A1 und 03 immer 18 Zeichen ohne, und 22 Zeichen mit Leerzeichen WENN der String nicht fehlerhaft ist. - Gebe ich {18,22} im Regex Pattern ein, passiert gar nichts. Bei {22,30} wird gematched, aber auch Zeichen, die überhaupt nicht zwischen 02 A1 und 03 stehen, oder auch fehlerhafte, zu kurze Strings. z.B. "02 A1 03" soll ignoriert werden.

    Ich hab verschiednene Pattern und Dinge ausprobiert => ich will einfach nur aus einer sehr langen .txt-Datei alle Strings, bei denen zwischen 02 1A und 03 mindestens 18 / 22 (mit / ohne Leerzeichen) Zeichen sind, verwenden und da dann die ersten beiden und 11-14. (ohne Leerzeichen) Zeichen rausfiltern und so in der txtBx-Textbox aufgelistet haben.

    Ist RegEx dafür überhaupt geeignet?
    Wenn ja, wo ist der Fehler im meinem Pattern?

    Ich bedanke mich schon mal für eure Hilfe
    Ich würde das Pattern 02 A1 (.{18,22}?) 03 verwenden.
    Die mittleren Zeichen in Gruppe 1 entfernen und zurückgeben.

    VB.NET-Quellcode

    1. Dim sourcestring As String = $"AA EE FF DD AA EE FE 02 A1 71 F0 FF FF 00 90 AA 03 02 A1 03 02 A1 03 FF FF FF FF EE DD AF FF
    2. 02 A1 03
    3. EE FF DD AA 02 A1 71 F0 FF FF 00 92 AA 03 02 A1 03 02 A1 03 FD FD CC
    4. 02 A1 03
    5. 02 A1 71 F0 FF FF 00 94 AA 03 02 A1 03 02 A1 03
    6. 02 A1 03"
    7. Dim re As Regex = New Regex("02 A1 (.{18,22}?) 03", RegexOptions.Multiline)
    8. Dim mc As MatchCollection = re.Matches(sourcestring)
    9. Dim mIdx As Integer = 0
    10. For Each m As Match In mc
    11. Console.WriteLine($"{m.Groups(1).Value.Remove(3, 12)}")
    12. mIdx += 1
    13. Next