Sehr einfache RegEx Frage -.-

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Higlav.

    Sehr einfache RegEx Frage -.-

    Hi,

    Ich arbeite gerade an einer Funktionsklasse und als kleine Erleichterung möchte ich einbauen, dass die Function Klasse im Konstruktor den Term ausformuliert. So soll zum Beispiel aus 3x 3*x werden. Hier mal der Versuch:

    VB.NET-Quellcode

    1. FunctionTerm = Regex.Replace(term, ".[0123456789,]*x", "$0".Replace("x", " ") & "*x").Trim


    rauskommen tut allerdings 3x*x. Ich versuch da grad ne Ewigkeit dran rum... Danke für die vermutlich simple Lösung ;D

    8-) faxe1008 8-)

    faxe1008 schrieb:

    "$0".Replace("x", " ")
    Was glaubst du, das hier passieren wird?
    Richtig, im String "$0" wird "x" gegen " " ersetzt, oder mit anderen Worten, es passiert gar nix und effektiv steht dort:

    VB.NET-Quellcode

    1. FunctionTerm = Regex.Replace(term, ".[0123456789,]*x", "$0" & "*x").Trim

    Wie soll es denn aussehen?

    //EDIT:
    Pffff, nicht richtig gelesen ^^

    //EDIT2:
    Das hier wäre meine Lösung für dein Problem:

    C#-Quellcode

    1. FunctionTerm = Regex.Replace(term, @"([\d,]+?)x", "$1*x");

    Erklärung:
    [\d,] macht das gleiche wie dein [0123456789,].
    +? matcht alle Zeichenfolgen, welche der vorhergehenden Zeichenmenge entsprechen und einer Länge von mindestens 1 haben, bis die nachfolgende Zeichenfolge auftritt.
    Die Klammern sorgen dafür, dass wir den Inhalt ohne das x bekommen.
    $1 ruft die erste Gruppe aus der Expression ab.

    Aus 1,4x+1y-12x wird dann 1,4*x+1y-12*x.


    MfG Stefan

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nafets3646“ ()

    Ich hab dir ja auch nur gezeigt, was du falsch machst, in der Hoffnung, dass du vielleicht selbst auf die Lösung kommst. Hat offensichtlich nicht funktioniert.
    Ich hab grad Spendierhosen an, also das hier ist die Lösung:

    VB.NET-Quellcode

    1. ​FunctionTerm = Regex.Replace(term, "([0123456789,]*)x", "$1*x").Trim()
    in ExpressionTree hab ich diese Anforderung in den Token-Parser verlegt - beachte den Comment:

    VB.NET-Quellcode

    1. Private Function Tokenize(expression As String) As List(Of Token)
    2. 'die <func> - Behandlung ist noch unausgegoren - vmtl. müssteman Token.OpCode auf Datentyp String ändern, oder Enum. Und derzeit wird <func> gemeinsam mit <operator> abgehandelt.
    3. Tokenize = New List(Of Token)
    4. Dim tkPrev = New Token("(", Token.TypeEnm.Separator)
    5. Dim tk = tkPrev
    6. For Each mt As Match In rgxToken.Matches(expression)
    7. Dim txt = mt.Value
    8. If mt.Groups("separator").Success Then
    9. tk = New Token(txt, Token.TypeEnm.Separator)
    10. ElseIf mt.Groups("operator").Success Then
    11. If txt = "-" AndAlso tkPrev.Type <= Token.TypeEnm.Operator Then txt = "~" 'nach operator oder separator bedeutet "-" Negation
    12. tk = New Token(txt, Token.TypeEnm.Operator)
    13. ElseIf mt.Groups("numb").Success Then
    14. tk = New Token(txt, Token.TypeEnm.Numb)
    15. ElseIf mt.Groups("const").Success Then
    16. tk = New Token(txt, Token.TypeEnm.Constant)
    17. ElseIf mt.Groups("func").Success Then
    18. tk = New Token(txt, Token.TypeEnm.Function)
    19. ElseIf mt.Groups("param").Success Then
    20. tk = New Token(txt, Token.TypeEnm.Param, _ParamTokens)
    21. ElseIf mt.Groups("adress").Success Then
    22. tk = New Token(txt, Token.TypeEnm.Adress, _ParamTokens)
    23. Else
    24. Stop
    25. End If
    26. If (tk.Type > Token.TypeEnm.Operator AndAlso tkPrev.Type > Token.TypeEnm.Operator) OrElse _
    27. (tk.Text = "(" AndAlso tkPrev.Type = Token.TypeEnm.Numb) Then
    28. Tokenize.Add(New Token("*", Token.TypeEnm.Operator)) 'bei aufeinander folgenden nicht-Operatoren eine Multiplikation zw.schieben
    29. End If
    30. Tokenize.Add(tk)
    31. tkPrev = tk
    32. Next
    33. End Function
    @Artentus Ich würde es so machen. MessageBox.Show(Regex.Replace(input, "([\d,]*[^\*])x", "$1*x").Trim())
    Wenn du nämlich schon ein * drin hast, ist der Wurm drin.
    (Das Pattern ist jetzt auch nicht 100% in Ordnung, aber reicht für den Anfang)

    @RoulettePilot Das ist easy wenn man es einmal richtig verstanden hat.
    Hm... Wie wäre das hier?

    VB.NET-Quellcode

    1. FunctionTerm = Regex.Replace(term, "(?<=[\d,]+?)\w", "*$0")

    Bei mir funktioniert's. ^^

    EDIT: Shiiiit. fünf Beiträge, während ich einen schrieb. 8o

    EDIT2: Oh, noch zu "+" geändert, sonst hascht'de Problem mit bereits vorhandenen Sternchen. ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Higlav“ ()

    @RushDen
    Es geht mir darum die Kurzschreibweise Zahlx zu Zahl*x umzuschreiben, denn sonst knallt der Parser auf dem die Klasse aufbaut :P

    @EDR: Das mit z.B. 2sin() => 2*sin() hab ich gelöst, aber nett von dir :thumbup:

    @LaMiy Stimmt, hab ich gar nicht dran gedacht :thumbsup:

    8-) faxe1008 8-)
    Guten Morgen,
    Habe gerade nochmals mein Pattern überarbeitet:

    VB.NET-Quellcode

    1. FunctionTerm = Regex.Replace(term, "(?<=(\d|[^+\-\*/(((arc|a|)(sin|cos|tan)(h|))|log|lg|ln|f)]))((((arc|a|)(sin|cos|tan)(h|))|log|lg|ln|f)\(|[a-z](?=[^\(]+|$))", "*$0")

    Getestet mit 1.5ln(4sin(1))/2f(3)-3xh. Ausgabe: 1.5*ln(4*sin(1))/2*f(3)-3*x*h

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