Befehl mit Parameter auslesen, evtl. Regex

  • VB.NET

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

    Befehl mit Parameter auslesen, evtl. Regex

    Ich habe folgende Zeile, wie kann ich nun bei diesem den Befehl ShowMessage und die 2 Parameter auslesen. Es kann vor der Klammer auch was anderes stehen und in der Klammer können auch mehr Parameter stehen.

    Quellcode

    1. ShowMessage("Dies ist eine Nachricht.", "Titel")

    singu schrieb:

    Es kann vor der Klammer auch was anderes stehen .

    Mit einem solchen Unterangebot an Informationen kann man Dir wieder einmal nicht helfen, und auf Ratespiele was Du wohl konkret beabsichtigen könntest fehlt mir heute sowohl die Zeit als auch die Lust. Ausserdem solltest Du Dich bei der Anzahl Deiner Beiträge auch mittlerweile selber mit Regex auskennen ...
    Hier mal der Code, wie ich mir das vorstelle.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim code As String = Nothing
    4. Dim befehl As String = Nothing
    5. Dim parameter1 As String = Nothing
    6. Dim parameter2 As String = Nothing
    7. ' In der Textbox steht folgende Zeichenfolge:
    8. ' ShowMessage("Dies ist eine Nachricht.", "Titel")
    9. code = Me.TextBox1.Text
    10. ' befehl soll dann ShowMessage enthalten
    11. ' parameter1 soll dann "Dies ist eine Nachricht." enthalten
    12. ' parameter2 soll dann "Titel" enthalten
    13. End Sub
    14. End Class
    Also ich hab es jetzt so weit hinbekommen, das er zwar den Befehl ausliest, aber die Klammer stört noch.

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim code As String = Nothing
    5. Dim befehl As String = Nothing
    6. Dim parameter1 As String = Nothing
    7. Dim parameter2 As String = Nothing
    8. ' In der Textbox steht folgende Zeichenfolge:
    9. ' ShowMessage("Dies ist eine Nachricht.", "Titel")
    10. code = Me.TextBox1.Text
    11. ' befehl soll dann ShowMessage enthalten
    12. ' parameter1 soll dann "Dies ist eine Nachricht." enthalten
    13. ' parameter2 soll dann "Titel" enthalten
    14. 'Dim txt As String = "ShowMessage(""Dies ist eine Nachricht."", ""Titel"")"
    15. Dim re1 As String = ".*?" 'Non-greedy match on filler
    16. Dim re2 As String = "\(" 'Any Single Character 1
    17. Dim r As Regex = New Regex(".*?\(", RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    18. Dim m As Match = r.Match(code)
    19. If (m.Success) Then
    20. For Each group As Group In m.Groups
    21. Console.WriteLine(group.ToString)
    22. Next
    23. 'Dim c1 = m.Groups(1)
    24. 'Console.WriteLine("(" + c1.ToString() + ")" + "")
    25. End If
    26. 'Console.ReadLine()
    27. End Sub
    28. End Class
    Wie wärs mit IndexOf("(")? Alles was davor ist ist der Befehl, alles danach bis LastIndexOf(")") die Parameter. Musst halt aufpassen da man auch z.B. ShowMessage(("bla"), ("1")) Schreiben könnte. Ich würde die Parameter hinterher bei , splitten
    Ich möchte es gerne mit Regex lösen, da es auch mehrere Parameter sein können und da scheiter ich momentan mit folgendem Code. Dieser liest nur 2 Parameter aus, aber es können auch mehrere Parameter sein und teilweise auch Integer.

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim code As String = Nothing
    5. Dim befehl As String = Nothing
    6. Dim parameter1 As String = Nothing
    7. Dim parameter2 As String = Nothing
    8. ' In der Textbox steht folgende Zeichenfolge:
    9. ' ShowMessage("Dies ist eine Nachricht.", "Titel")
    10. code = Me.TextBox1.Text
    11. ' befehl soll dann ShowMessage enthalten
    12. ' parameter1 soll dann "Dies ist eine Nachricht." enthalten
    13. ' parameter2 soll dann "Titel" enthalten
    14. 'Dim txt As String = "ShowMessage(""Dies ist eine Nachricht."", ""Titel"")"
    15. 'Dim re1 As String = ".*?" 'Non-greedy match on filler
    16. 'Dim re2 As String = "\(" 'Any Single Character 1
    17. Dim re1 As String = "((?:[a-z][a-z0-9_]*))" 'Variable Name 1
    18. Dim re2 As String = ".*?" 'Non-greedy match on filler
    19. Dim re3 As String = "("".*?"")" 'Double Quote String 1
    20. Dim re4 As String = ".*?" 'Non-greedy match on filler
    21. Dim re5 As String = "("".*?"")" 'Double Quote String 2
    22. Dim r As Regex = New Regex(re1 + re2 + re3 + re4 + re5, RegexOptions.IgnoreCase Or RegexOptions.Singleline)
    23. Dim m As Match = r.Match(code)
    24. If (m.Success) Then
    25. For Each group As Group In m.Groups
    26. Console.WriteLine(group.Value)
    27. Next
    28. Dim c1 = m.Groups(1)
    29. Console.WriteLine("(" + c1.ToString() + ")" + "")
    30. End If
    31. 'Console.ReadLine()
    32. End Sub
    33. End Class
    @Smoove: Momentan nicht berücktsichtigt, kann aber auch vorkommen, wird aber noch kommen. Nur momentan nicht. Mir geht es lediglich darum, wie ich sauber die Methoden hier z.b. ShowMessage und die Parameter in der Klammer auslesen kann.

    Edit: @EiPott: Split und IndexOf möchte ich vermeiden, da die Befehle unterschiedlich sind und auch verschiedene Parameter haben.
    Hallo singu,
    Ich habe jetzt 'ne Lösung für dein Problem gefunden.
    Allerdings nicht die beste.
    Wenn ich rausfinde wie es noch besser geht ( sprich mit 1 Regex ) poste ich es.

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim Target As String = "ShowMessage(""Dies ist eine Nachricht."", ""Titel"")"
    5. Dim Start As String = Regex.Match(Target, "([a-zA-Z]+)").Groups(1).Value
    6. Dim Parameter As MatchCollection = Regex.Matches(Target, """([^),""]+)""")
    7. For Each m As Match In Parameter
    8. MessageBox.Show(m.Groups(1).Value)
    9. Next
    10. End Sub
    11. End Class


    Mfg Kevin.