Einfache mathematische Ausdrücke mithilfe von RegEx berechnen

    • VB.NET

      Einfache mathematische Ausdrücke mithilfe von RegEx berechnen

      Hallo!

      Da öfters im Forum nach mathematischen Parser gefragt wurde, habe ich mir mal die Mühe gemacht und einen Parser mithilfe von RegEx geschrieben.

      Erstellt eine neue Klasse namens "Parser" und schreibt wie folgt:

      VB.NET-Quellcode

      1. Public Class Parser
      2. ''' <summary>
      3. ''' Berechnet eine Rechnung, die als String vorliegt. (Funktioniert nicht mit Kommazahlen)
      4. ''' </summary>
      5. ''' <param name="value">Die Rechnung, die berechnet werden soll.</param>
      6. ''' <returns>Gibt die Lösung zurück.</returns>
      7. ''' <remarks></remarks>
      8. Public Shared Function Parse(ByVal value As String) As Integer
      9. Dim result As String = value
      10. ' Potenz vor Punkt vor Strich
      11. Do While Regex.Matches(result, "(\^)").Count > 0 ' Solange ausführen, bis keine Potenzen mehr vorhanden sind
      12. result = Regex.Replace(result,
      13. "(?<zahl1>[0-9]+)(\^)(?<zahl2>[0-9]+)", Function(match As Match)
      14. Return Int32.Parse(match.Groups("zahl1").Value) ^ Int32.Parse(match.Groups("zahl2").Value)
      15. End Function)
      16. Loop
      17. Do While Regex.Matches(result, "(\*|\/)").Count > 0 ' Solange ausführen, bis keine Punktrechnung mehr vorhanden ist
      18. result = Regex.Replace(result,
      19. "(?<zahl1>[0-9]+)(?<operant>(\*|\/))(?<zahl2>[0-9]+)", Function(match As Match)
      20. Select Case match.Groups("operant").Value
      21. Case "*" ' Wenn Operant das Multiplikationszeichen ist
      22. Return Int32.Parse(match.Groups("zahl1").Value) * Int32.Parse(match.Groups("zahl2").Value)
      23. Case "/" ' Wenn Operant das Divisionsszeichen ist
      24. Return Int32.Parse(match.Groups("zahl1").Value) / Int32.Parse(match.Groups("zahl2").Value)
      25. Case Else
      26. Return 0
      27. End Select
      28. End Function)
      29. Loop
      30. Do While Regex.Matches(result, "(\+|\-)").Count > 0 ' Solange ausführen, bis keine Strichrechnung mehr vorhanden ist
      31. result = Regex.Replace(result,
      32. "(?<zahl1>[0-9]+)(?<operant>(\+|\-))(?<zahl2>[0-9]+)", Function(match As Match)
      33. Select Case match.Groups("operant").Value
      34. Case "+" ' Wenn Operant das Additionszeichen ist
      35. Return Int32.Parse(match.Groups("zahl1").Value) + Int32.Parse(match.Groups("zahl2").Value)
      36. Case "-" ' Wenn Operant das Subtraktionsszeichen ist
      37. Return Int32.Parse(match.Groups("zahl1").Value) - Int32.Parse(match.Groups("zahl2").Value)
      38. Case Else
      39. Return 0
      40. End Select
      41. End Function)
      42. Loop
      43. Return Int32.Parse(result)
      44. End Function
      45. End Class


      Jetzt könnt ihr die Funktion via "Parser.Parse(blah)" aufrufen. Die Funktion gibt euch die Lösung zurück.

      lg. RegEx

      PS: Der Code wird hier irgendwie schlecht dargestellt. ^^