Reguläre Ausdrücke mit VBA

  • Allgemein

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

    Reguläre Ausdrücke mit VBA

    Hallo zusammen,

    ich komme nicht mehr weiter bei einem regulären Ausdruck.
    Ein paar Dinge konnte ich soweit finden lassen, aber beim tatsächlichen Suchstring hängt es.

    Hier ist der String, aus dem ich was raussuchen möchte:
    ; ************************************
    ; T2 VHM-BOHRER D9 5XD
    N40 T2
    N50 L300
    N60 S3500 M3 T3
    [... ausgeblendet ...]
    N360 G0 X-342 Y147.5
    N370 G0 Z42
    N380 G0 Z90 M9

    ; ************************************
    ; T3 VHM-BOHRER D8.3 5XD
    N400 L300
    N410 S3850 M3 T4
    [... ausgeblendet ...]
    N530 G0 X0 Y0
    N540 G0 Z42
    N550 G0 Z90 M9
    N560 G75 FP=1 Z1=0

    [... ausgeblendet ...]
    N1340 M30


    Ich möchte immer nur T... (... steht für eine Zahl welche 1- bis 3-stellig sein kann) raussuchen. Dabei sollen nur Die T... rausgesucht werden, welche nicht auskommentiert sind. Auskommentiert bedeutet, alles wo in der gleichen Zeile ein Semikolon davor steht.
    Als Ergebnis sollte dann folgendes herauskommen:
    T3
    T4

    Ich teste das ganze mit dem Progammm: RegEx Tester v3.2.0.0 (Darin habe ich die Häckchen bei 'Ignore Case', 'Multi Line' und 'Culture Invariant' gesetzt.
    Mit dem folgenden Ausdruck finde ich schon mal alle T... .

    Quellcode

    1. T[0-9][0-9]{0,2}


    Mit dem nächsten Ausdruck finde ich alle T... welche mit einem Semikolon beginnen.

    Quellcode

    1. ;.*T[0-9][0-9]{0,2}


    Ich möchte jedoch alle T... finden, welche sich in einer Zeile ohne Semikolon davor befinden.
    Ich habe schon mit dem Negieren-Symbol ^ versucht, jedoch weiß ich nicht genau wie ich dieses einzusetzen habe.
    Mit der Anleitung von danielfett habe ich mich schon eingelesen, aber mit dem Tutorial komme ich nicht zu einer Lösung meines Problems.

    Habt ihr eine guten Anleitung oder ein Buch, wo die regulären Ausdrücke verständlich erklärt werden?
    Oder hat jemand einen Tipp, wie ich einen Ausdruck bilden kann?

    Viele Grüße
    Thomas

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

    Hallo @ThomasLx

    Auf deiner verlinkten Seite steht eigentlich alles was du brauchst.

    mit ^ suchst du am Zeilenanfang (Modifikatoren)
    mit (?!;) sucht du alles was nicht mit ; beginnt (Negative Lookaheads und Lookbehinds)
    mit .* suchst du beliebige Zeichen (Platzhalter)
    mit (T\d{1,3}) sucht du ein T gefolgt mit einer ein- bis dreistelliger Zahl. (Gruppen)

    Und jetzt nur noch zusammensetzen und du erhält deinen Suchstring ^(?!;).*(T\d{1,3}).
    Die Suchresultate findest du dann in den SubMatches.
    Code zum testen

    Visual Basic-Quellcode

    1. Private Sub RegexTest()
    2. Dim regEx As New RegExp
    3. Dim objMatch As MatchCollection
    4. Dim mmatch As Match
    5. Dim strInput As String
    6. Dim intIndex As Integer
    7. strInput = "; ************************************" & vbCrLf & _
    8. "; T2 VHM-BOHRER D9 5XD" & vbCrLf & _
    9. "; T99 VHM-BOHRER D9 5XD" & vbCrLf & _
    10. "N40 T2" & vbCrLf & _
    11. "N50 L300" & vbCrLf & _
    12. "N60 S3500 M3 T3" & vbCrLf & _
    13. "[... ausgeblendet ...]" & vbCrLf & _
    14. "N360 G0 X-342 Y147.5" & vbCrLf & _
    15. "N370 G0 Z42" & vbCrLf & _
    16. "N380 G0 Z90 M9" & vbCrLf & vbCrLf & _
    17. "; ************************************" & vbCrLf & _
    18. "; T3 VHM-BOHRER D8.3 5XD" & vbCrLf & _
    19. "N400 L300" & vbCrLf & _
    20. "N410 S3850 M3 T4" & vbCrLf & _
    21. "[... ausgeblendet ...]" & vbCrLf & _
    22. "N530 G0 X0 Y0" & vbCrLf & _
    23. "N540 G0 Z42" & vbCrLf & _
    24. "N550 G0 Z90 M9" & vbCrLf & _
    25. "N560 G75 FP=1 Z1=0" & vbCrLf & vbCrLf & _
    26. "[... ausgeblendet ...]" & vbCrLf & _
    27. "N1340 M30 "
    28. With regEx
    29. .Global = True
    30. .MultiLine = True
    31. .IgnoreCase = True
    32. .Pattern = "^(?!;).*(T\d{1,3})"
    33. Set objMatch = .Execute(strInput)
    34. End With
    35. For Each mmatch In objMatch
    36. Debug.Print "Match found at position "
    37. Debug.Print "Col. " & mmatch.FirstIndex & ": Match Value is '" & mmatch.Value & "'"
    38. Debug.Print " Submatches-->" & mmatch.SubMatches(0) & vbCrLf
    39. Next
    40. End Sub

    Gruss HenryV
    Das ist schön, so habe ich es jetzt auf jeden Fall besser verstanden.
    Hier habe ich es noch um eine Sache erweitert ^(?!.*;).*(T\d{1,3}).
    Damit werden jetzt auch Zeilen abgefasst, wo das Semikolon nicht direkt am Zeilenanfang steht.

    Wie bzw. wo hast du das eigentlich mit den regulären Ausdrücken gelernt?
    Hi,
    wie stellst Du eigentlich sicher, dass da kein Stringwert ist, der bspw. T1 ist und trotzdem nicht die Markierung, die Du haben willst ?

    Beispiel: N60 T1 S3500 M3 T3

    oder T1S3 usw. ...

    Je nachdem, wie die Antwort darauf, würde ich mein Vorgehen/Vorschlag abstimmen.
    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)