首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

从网下上的一个用正则表达是做的表达式计算器,它的加减法有有关问题,哪一位高手能够帮助修改正确,多谢!

2012-08-09 
从网上下的一个用正则表达是做的表达式计算器,它的加减法有问题,哪一位高手能够帮助修改正确,谢谢!!!从网

从网上下的一个用正则表达是做的表达式计算器,它的加减法有问题,哪一位高手能够帮助修改正确,谢谢!!!
从网上下的一个用正则表达是做的表达式计算器,它的加减法有问题,哪一位高手能够帮助修改正确,谢谢!!!
如4-2*(1+1)=4、4+2*(1+1)=12

4+2*(2+3)计算不正确 2*(2+3)+4 就能计算正确

VB.NET code
 Imports System.Text.RegularExpressionsPublic Class Form2    Public Primitives As New Hashtable    Function Evaluate(ByVal expr As String) As Double        Const Num As String = "(\-?\d+\.?\d*)"        Const Func1 As String = "(exp|log|log10|abs|sqr|sqrt|sin|cos|tan|asin|acos|atan)"        Const Func2 As String = "(atan2)"        Const FuncN As String = "(min|max)"        Const Constants As String = "(e|pi)"        Dim rePower As New Regex(Num & "\s*(\^)s*" & Num)        Dim reAddSub As New Regex(Num & "\s*([-+])s*" & Num)        Dim reMulDiv As New Regex(Num & "\s*([*/])s*" & Num)        Dim reFunc1 As New Regex(Func1 & "\(\s*((\((?<o>\()|(?<-o>\))|[^()]+(?(o)(?!)))+)\s*\)", RegexOptions.IgnoreCase)        Dim reFunc2 As New Regex(Func2 & "\(\s*" & Num & "\s*,\s*" & Num & "\s*\)", RegexOptions.IgnoreCase)        Dim reFuncN As New Regex(FuncN & "\((\s*" & Num & "\s*,)+\s*" & Num & "\s*\)", RegexOptions.IgnoreCase)        Dim reSign1 As New Regex("([-+/*^])\s*\+")        Dim reSign2 As New Regex("\-\s*\-")        Dim rePar As New Regex("(?<![A-Za-z0-9])\(\s*([-+]?\d+.?\d*)\s*\)")        Dim reNum As New Regex("^\s*[-+]?\d+\.?\d*\s*$")        Dim reConst As New Regex("\s*" & Constants & "\s*", RegexOptions.IgnoreCase)        expr = reConst.Replace(expr, AddressOf DoConstants)        Do Until reNum.IsMatch(expr)            Dim saveExpr As String = expr            Do While rePower.IsMatch(expr)                expr = rePower.Replace(expr, AddressOf DoPower)            Loop            Do While reMulDiv.IsMatch(expr)                expr = reMulDiv.Replace(expr, AddressOf DoMulDiv)            Loop            Do While reFuncN.IsMatch(expr)                expr = reFuncN.Replace(expr, AddressOf DoFuncN)            Loop            Do While reFunc2.IsMatch(expr)                expr = reFunc2.Replace(expr, AddressOf DoFunc2)            Loop            Do While reFunc1.IsMatch(expr)                expr = reFunc1.Replace(expr, AddressOf DoFunc1)            Loop            expr = reSign1.Replace(expr, "$1")            expr = reSign2.Replace(expr, "+")            Do While reAddSub.IsMatch(expr)                expr = reAddSub.Replace(expr, AddressOf DoAddsub)            Loop            expr = rePar.Replace(expr, "$1")        Loop        Return CDbl(expr)    End Function    Function DoConstants(ByVal m As Match) As String        Select Case m.Groups(1).Value.ToUpper            Case "PI"                Return Math.PI.ToString            Case "E"                Return Math.E.ToString            Case Else                Return vbNullString        End Select    End Function    Function DoPower(ByVal m As Match) As String        Dim n1 As Double = CDbl(m.Groups(1).Value)        Dim n2 As Double = CDbl(m.Groups(3).Value)        Return (n1 ^ n2).ToString    End Function    Function DoMulDiv(ByVal m As Match) As String        Dim n1 As Double = CDbl(m.Groups(1).Value)        Dim n2 As Double = CDbl(m.Groups(3).Value)        Select Case m.Groups(2).Value            Case "/"                Return (n1 / n2).ToString            Case "*"                Return (n1 * n2).ToString            Case Else                Return vbNullString        End Select    End Function    Function DoAddsub(ByVal m As Match) As String        Dim n1 As Single = CDec(m.Groups(1).Value)        Dim n2 As Single = CDec(m.Groups(3).Value)        Select Case m.Groups(2).Value            Case "+"                Return (n1 + n2).ToString            Case "-"                Return (n1 - n2).ToString            Case Else                Return vbNullString        End Select    End Function    Function DoFunc1(ByVal m As Match) As String        Dim n1 As String = m.Groups(2).Value        Select Case m.Groups(1).Value.ToUpper            Case "EXP"                Return Math.Exp(n1).ToString            Case "LOG"                Return Math.Log(n1).ToString            Case "LOG10"                Return Math.Log10(n1).ToString            Case "ABS"                Return Math.Abs(CDec(n1)).ToString            Case "SQR", "SQRT"                Return Math.Sqrt(n1).ToString            Case "SIN"                Return Math.Sin(n1).ToString            Case "COS"                Return Math.Cos(n1).ToString            Case "TAN"                Return Math.Tan(n1).ToString            Case "ASIN"                Return Math.Asin(n1).ToString            Case "ACOS"                Return Math.Acos(n1).ToString            Case "ATAN"                Return Math.Atan(n1).ToString            Case Else                Return vbNullString        End Select    End Function    Function DoFunc2(ByVal m As Match) As String        Dim n1 As Double = CDbl(m.Groups(2).Value)        Dim n2 As Double = CDbl(m.Groups(3).Value)        Select Case m.Groups(1).Value.ToUpper            Case "ATAN2"                Return Math.Atan2(n1, n2).ToString            Case Else                Return vbNullString        End Select    End Function    Function DoFuncN(ByVal m As Match) As String        Dim args As New ArrayList()        Dim i As Integer = 2        Do While m.Groups(i).Value <> ""            args.Add(CDbl(m.Groups(i).Value.Replace(","c, " "c)))            i += 1        Loop        Select Case m.Groups(1).Value.ToUpper            Case "MIN"                args.Sort()                Return args(0).ToString            Case "MAX"                args.Sort()                Return args(args.Count - 1).ToString            Case Else                Return vbNullString        End Select    End Function    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        TextBox2.Text = Evaluate(TextBox1.Text)    End Sub    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load    End SubEnd Class 



[解决办法]
一眼望不穿啊。
没这个时间,等其他人来吧 ,或者就等我晚上下班。只有你不急
[解决办法]
探讨
从网上下的一个用正则表达是做的表达式计算器,它的加减法有问题,哪一位高手能够帮助修改正确,谢谢!!!
如4-2*(1+1)=4、4+2*(1+1)=12

4+2*(2+3)计算不正确 2*(2+3)+4 就能计算正确

热点排行