举个例子来说吧:用户在一文本框中输入“(订货数量>100)and(库存数量<100)”,比如这是一个正确的表达式,但是考虑到用户输入有可能出现少加或多加或连加括号、比较运算符、逻辑运算符等等多种可能使得该表达式不合法,如果出现不合法的情况需要提示用户更正,就是做这样的验证,本人没做过没经验,想想去也来想不出好的解决办法,希望大家指点,谁有这方面经验或者例子最好了。

解决方案 »

  1.   

    先简单的查一下括号是否成对存在
    然后 逐层拆分 将每次拆分的结果保存到List中 看是否能拆分下去
    然后对List的各个元素 例如(订货数量>100)进行检查当然 这样会很复杂 考虑通过各种按钮限制用户的输入 可以搜索一下各类开发工具对应的万能查询组件
    希望你能找到合适的解决办法
      

  2.   

    楼上的兄弟们给了我一定的启发,正则表达式我原来没学过,最近刚看,感觉是个不错的方法,比如非法字符以及括号是否成对它都可以判断,但这只是其中的一小部分,对于此条件表达式验证的要求来说:因为一般一个条件表达式有可能包括逻辑运算、比较运算符以及算术表达式的合法性等等,难就难在这些因素都需要考虑到,如果用纯java程序来判断的话肯定是复杂的很,对于我的水平来说即使把所有可能都考虑全了也肯定做不来,正则表达式最近刚学还不熟,不知道它的功能有多强,它可以把验证中所有涉及到的因素都实现吗?如果不能还有其他方法吗?
      

  3.   

    不管它输入什么,执行,如果报错,就catch住呗,就说明他输入的条件是非法的
      

  4.   

    zhengpeiyong,你说的不是我想问的,谢谢~ 
      

  5.   

    抱歉是我之前的问题说的不够明白,其实这并不是一个简单的验证,要考虑的合法性的细节因素很多,最近发现用java程序结合正则表达式还是有的做的,只是要做的处理很多,很难想的周全。下面我再把这个问题说的更明白点:
    举个相对全面的例子来说“(订货数量>(10+3)*2)&&(库存数量<100)||!(设置人名称!="super")”,此为用户输入的字符串,要求验证它是符合java语法规则的(其中"订货数量"和"库存数量"和"设置人名称"是数据表里取出的域字段,包括它们对应的数据类型,它们可以以中文形式存在,因为以后会有解析的程序将它们转换成常量)那么上面那个例子就是一个符合java语法规则的正确例子,然而在用户输入的过程中出现不合法的情况是很正常的,因为可能出错的情况n多,所以要验证到很精确的程度(对我来说)是很难的。下面说一下我的思路:先将这个字符串按逻辑运算符&&和||进行拆分(java中引用正则表达式),那么如果合法的话拆分的每个部分都应该是一个带比较运算符的条件语句(其中比较运算符有且只有一个并且左右至少有一个字符)如果不符合就跳出循环弹出错误框,如果符合就继续循环把每个部分再按照比较运算符进行拆分,拆分后的部分可以是像"订货数量"这样的变量,也可以是一个算术表达式,当然还要继续验证变量或者算术表达式是否符合语法规则……还想到两个特殊的非法情况:
    1、逻辑非也就是!后面应该至少接一个括号,否则会出现不合法的情况。
    2、此字符串中出现")("的情况也是不合法的,它中间只可能加"&&、||、+、-、*、/、>、<、<=、>=、==、!="。目前能想到的就这么多,是个大概的思路,希望大家给予建议或者补充。
      

  6.   

    思考进入误区了,如果一定要从语法分析是无穷无尽的,而我们恰恰有更简单的方法去判断是否正确。如楼主所言,应当是要判断这个条件是否正确,那么这个条件既然是到数据库里执行的话,你只要做一个测试就行了,就是  select 1 from table where 1=1 and (输入的条件) ,这要这个查询报错就提示用户重新输入就OK了,至于是哪里错了,先别管了,呵呵。
      

  7.   

    哦,忘了说了,如果不是SQL条件的话,可以进行转化为SQL条件,借助SQL引擎一切就OK了
      

  8.   

    LexChen阿修罗,谢谢你!一语点醒梦中人,这个真是一个非常好的方法,相对与原来笨方法真是一下减轻了很大的工作量,又长经验了!