Variable mit Regex auslesen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    Variable mit Regex auslesen

    Ich habe folgendes Problem und zwar habe ich einer Textdatei mehrere Variablen.

    Diese werden folgendermaßen deklariert.

    Quellcode

    1. Dim $variable


    Nun möchte ich aber mit Regex auch folgende Möglichkeiten abdecken.

    Quellcode

    1. Dim $variable = 1
    2. Dim $variable = 1.5
    3. Dim $variable = "Test"


    Den oberen Teil habe ich schon mit Regex ausgelesen. Wie kann ich nun die anderen Möglichkeiten auch mit Regex abdecken?

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

    einfach alle Pattern ausprobieren und bei welchem ein Match oder mehr herauskommt, da wirds wohl stimmen...aber wenn ich dich wäre und du eine Art Scriptingsprache programmieren willst, dann würde ich jede Zeile durchlaufen und mit ganz normalen Stringoperationen überprüfen, da dies sicher schneller wäre...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    wenn du es besser verstehen und kennenlernen willst, warum fragst du dann nach jedem/jedem zweiten Pattern? Probier doch einfach mal solange an einem Pattern herum, bis es funktioniert...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Mein Pattern sieht momentan so aus und jetzt habe ich aber das Problem das er schon den ersten Pattern nimmt auch wenn hinter dem = was steht.

    VB.NET-Quellcode

    1. Dim ParseFormats As String() = { _
    2. "(Dim).*?((?<variable>[a-z][a-z0-9_]*))", _
    3. "(Dim).*?((?<variable>[a-z][a-z0-9_]*)).*?(=).*?(?<wert>(\d+))", _
    4. "(Dim).*?((?<variable>[a-z][a-z0-9_]*)).*?(=).*?(?<wert>([+-]?\d*\.\d+)(?![-+0-9\.]))", _
    5. "(Dim).*?((?<variable>[a-z][a-z0-9_]*)).*?(=).*?(?<wert>("".*?""))"}
    Die Pattern stimmen alle. Nur hab ich jetzt wieder ein Problem und zwar habe ich ein Patter für Werte mit Integer und ein Patter für Werte mit Double. Nun feuert die Patter für Integer früher als der für Double. Wie kann ich das nun so machen, das der richtige Patter bei der richtigen Zeichenfolge feuert.
    Double zuerst laufen lassen, da dieser ja nur mit Kommata reagieren sollte...

    aber Allgemein würde ich nur zwei Pattern schreiben, einmal mit Wertzuweißung und einmal ohne, auf den Typ kannst du danach überprüfen, indem du überprüfst ob ein Kommata drinne ist, bzw. Anführungszeichen...ist wesentlich Performanter, schneller und einfacher...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Werde ich auch machen, weil ich prüfe welchen Typ der Wert hat und speicher den Wert in einer Eigenschaft der Klasse und alle Variablen speichere ich in einem HashTable.

    Wie würde der Patter aussehen, wenn ich nur den Namen und nur den Wert haben möchte
    Egal wie ich den letzten Teil des Patter schreib. Ich bekomm einfach das Leerzeichen vor dem Wert nicht weg.

    VB.NET-Quellcode

    1. Dim txt As String = "Dim $variable = ""Test"""
    2. Dim re1 As String = "(Dim)" 'Variable Name 1
    3. Dim re2 As String = ".*?" 'Non-greedy match on filler
    4. Dim re3 As String = "((?:[a-z][a-z0-9_]*))" 'Variable Name 2
    5. Dim re4 As String = ".*?" 'Non-greedy match on filler
    6. Dim re5 As String = "(=)" 'Any Single Character 1
    7. Dim re6 As String = ".*?" 'Non-greedy match on filler
    8. Dim re7 As String = "((?:.[^\d$]*))" 'Double Quote String 1
    9. Dim r As Regex = New Regex(re1 + re2 + re3 + re4 + re5 + re6 + re7, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    10. Dim m As Match = r.Match(txt)
    11. If (m.Success) Then
    12. Dim var1 = m.Groups(1)
    13. Dim var2 = m.Groups(2)
    14. Dim c1 = m.Groups(3)
    15. Dim string1 = m.Groups(4)
    16. Console.WriteLine("(" + var1.ToString() + ")" + "(" + var2.ToString() + ")" + "(" + c1.ToString() + ")" + "(" + string1.ToString() + ")" + "")
    17. End If