zoukankan      html  css  js  c++  java
  • 利用正则表达式判断四则运算表达式是否合法

    写了一个判断四则运算合法性较验的式子。    

    public static bool CheckExpressionValid(string input)
    {
        string pattern = @"^(((?<o>\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?<-o>\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$";
        //去掉空格,且添加括号便于进行匹配
        return Regex.IsMatch("(" + input.Replace(" ", "") + ")", pattern);
    }
    public static bool CheckExpressionValid(string input) 
    { 
        string pattern = @"^(((?<o>\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?<-o>\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))$";     
        //去掉空格,且添加括号便于进行匹配     
        return Regex.IsMatch("("+ input.Replace(" ", "") + ")", pattern); 
    }

    较难的地方在于括号的匹配,(? <o> \()是用来把左括号保存到o变量下,对应于(? <-o> \))用来去掉左括号,(?(o)(?!)) 是匹配完了右括号后,如果还剩下左括号,则不需再进行匹配。

    测试代码 

    string[] inputs = new string[] 
    
    {  
        "(", 
        "(() ",  
        "1 / ",  
        ")1 ",  
        "+3 ",  
        "((1) ",  
        "(1)) ",  
        "(1) ",  
        "1 + 23",  
        "1+2*3 ",  
        "1*(2+3) ",                  
        "((1+2)*3+4)/5 ",  
        "1+(2*) ",                                                  
        "1*(2+3/(-4)) ",                  
    }; 
      
    foreach(string input in inputs) 
    { 
        Console.WriteLine("{0}:{1} ", input, CheckExpressionValid(input)); 
    } 
    Console.ReadKey();
     

    项目中用到的地方是与此略有不同,表达式为:"产品面积*单价",所以调用CheckExpressionValid函数前需要再转换一下,转换较为简单,将"产品面积"替换成数字即可,[\u4e00-\u9fa5])+用来匹配中文。 

    private static bool CheckCalcExpressionValid(string expression) 
    { 
      string parttern = @"(产品面积|单价|印张数量)\.([\u4e00-\u9fa5])+"; 
      string matchparttern = "1 "; 
      return CheckExpressionValid(Regex.Replace(expression, parttern, matchparttern)); 
    }
     
     
  • 相关阅读:
    C++ 模板实现败者树,进行多路归并
    CentOS 7 使用 Realtek 8188eu 上网 (解决 Required key not available)
    C++ Concurrency in Action 读书笔记
    Linux操作系统是如何工作的
    大型项目使用Automake/Autoconf完成编译配置
    Socket 用于进程间通信 --- UNIX Domain Socket
    在Linux中实现类似windows中获取配置文 件的函数GetProfileString
    Linux Shell 1
    YAML
    ubuntu虚拟机如何连接到windows上安装的Navicat
  • 原文地址:https://www.cnblogs.com/fm168/p/2733499.html
Copyright © 2011-2022 走看看