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:
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.
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
- Public Class Parser
- ''' <summary>
- ''' Berechnet eine Rechnung, die als String vorliegt. (Funktioniert nicht mit Kommazahlen)
- ''' </summary>
- ''' <param name="value">Die Rechnung, die berechnet werden soll.</param>
- ''' <returns>Gibt die Lösung zurück.</returns>
- ''' <remarks></remarks>
- Public Shared Function Parse(ByVal value As String) As Integer
- Dim result As String = value
- ' Potenz vor Punkt vor Strich
- Do While Regex.Matches(result, "(\^)").Count > 0 ' Solange ausführen, bis keine Potenzen mehr vorhanden sind
- result = Regex.Replace(result,
- "(?<zahl1>[0-9]+)(\^)(?<zahl2>[0-9]+)", Function(match As Match)
- Return Int32.Parse(match.Groups("zahl1").Value) ^ Int32.Parse(match.Groups("zahl2").Value)
- End Function)
- Loop
- Do While Regex.Matches(result, "(\*|\/)").Count > 0 ' Solange ausführen, bis keine Punktrechnung mehr vorhanden ist
- result = Regex.Replace(result,
- "(?<zahl1>[0-9]+)(?<operant>(\*|\/))(?<zahl2>[0-9]+)", Function(match As Match)
- Select Case match.Groups("operant").Value
- Case "*" ' Wenn Operant das Multiplikationszeichen ist
- Return Int32.Parse(match.Groups("zahl1").Value) * Int32.Parse(match.Groups("zahl2").Value)
- Case "/" ' Wenn Operant das Divisionsszeichen ist
- Return Int32.Parse(match.Groups("zahl1").Value) / Int32.Parse(match.Groups("zahl2").Value)
- Case Else
- Return 0
- End Select
- End Function)
- Loop
- Do While Regex.Matches(result, "(\+|\-)").Count > 0 ' Solange ausführen, bis keine Strichrechnung mehr vorhanden ist
- result = Regex.Replace(result,
- "(?<zahl1>[0-9]+)(?<operant>(\+|\-))(?<zahl2>[0-9]+)", Function(match As Match)
- Select Case match.Groups("operant").Value
- Case "+" ' Wenn Operant das Additionszeichen ist
- Return Int32.Parse(match.Groups("zahl1").Value) + Int32.Parse(match.Groups("zahl2").Value)
- Case "-" ' Wenn Operant das Subtraktionsszeichen ist
- Return Int32.Parse(match.Groups("zahl1").Value) - Int32.Parse(match.Groups("zahl2").Value)
- Case Else
- Return 0
- End Select
- End Function)
- Loop
- Return Int32.Parse(result)
- End Function
- 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.