表达式解析问题

问题描述

每个表达式除括号体外,运算符只可能会出现一种(OR或AND)以下是举例了6个表达式,请问如果可以通过高效的算法来确认是OR还是AND运算表达式,并把每个子表达式放入数组中?(1)Express1ORExpress2是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2(2)Express1OR(Express2ANDExpress3)是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=(Express2ANDExpress3)(3)Express1ORExpress2ORExpress3OR(Express4ANDExpress5)是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2Str[2]=Express3Str[3]=(Express4ANDExpress5)(4)Express1ANDExpress2是AND运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2(5)Express1ORExpress2ORExpress3ORExpress4ORExpress5是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2Str[2]=Express3Str[3]=Express4Str[4]=Express5(6)(Express1ANDExpress2)OR(Express3ANDExpress4)是OR运算表达式,子表达式放入数组如下:Str[0]=(Express1ANDExpress2)Str[1]=(Express3ANDExpress4)(5)Express1ORExpress2ORExpress3ORExpress4ORExpress5是OR运算表达式,子表达式放入数组如下:Str[0]=Express1Str[1]=Express2Str[2]=Express3Str[3]=Express4Str[4]=Express5(6)(Express1ANDExpress2)OR(Express3ANDExpress4)是OR运算表达式,子表达式放入数组如下:Str[0]=(Express1ANDExpress2)Str[1]=(Express3ANDExpress4)

解决方案

解决方案二:
求解决思路和方法?急!!!
解决方案三:
如果看过数据结构上的四则运算求值的算法,做这个就很简单:逆波兰式
解决方案四:
引用2楼Inhibitory的回复:

如果看过数据结构上的四则运算求值的算法,做这个就很简单:逆波兰式

能给出解析实例方法吗?先谢了
解决方案五:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了
解决方案六:
引用3楼u014388068的回复:

Quote: 引用2楼Inhibitory的回复:
如果看过数据结构上的四则运算求值的算法,做这个就很简单:逆波兰式

能给出解析实例方法吗?先谢了

这个网上搜索很多的http://leon-a.iteye.com/blog/186104
解决方案七:
引用4楼dokia123的回复:

这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了

如果是括号里面再套括号呢?
解决方案八:
试试正则表达式,先把括号里面的and,or替换成其他特殊字符,再用split分割,完了再把and,or换回来。
解决方案九:
引用6楼u014388068的回复:

Quote: 引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了

如果是括号里面再套括号呢?

针对以下表达式,字符串.split("AND")会产生错乱的现象.(Express1ANDExpress2)AND(Express3ANDExpress4)
解决方案十:
如果表达式变成以下情况,字符串.split("OR")就可以分割成两个表达式:(1)(Express1ANDExpress2)(2)(Express3ANDExpress4)(Express1ANDExpress2)OR(Express3ANDExpress4)
解决方案十一:
引用6楼u014388068的回复:

Quote: 引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了

如果是括号里面再套括号呢?

我只是提了下自己的思路撒,而且问题的某些方面你也没说清楚,比如括号里可以套括号,然后这种情况应该处理成什么样。
解决方案十二:
以下是本人写的一个简单的解析分解最小单位表达式和运算表达符号,请大家指点,是否可以优化并写的更高效?先谢了.publicclassexpressionParse{privatestaticintA3(Stringexpress){intflag=0;intpos=0;if(express.indexOf("(")>=0){char[]strs=express.toCharArray();for(inti=0;i<strs.length;i++){if((strs[i])=='(')flag++;elseif(strs[i]==')'){flag--;if(flag==0){pos=i;break;}}}}returnpos;}privatestaticStringA2(Stringexpress){Stringsingle="";if(express.indexOf("(")==0){intpos=A3(express);express=express.substring(pos+1,express.length());}intorPos=express.indexOf("OR");intandPos=express.indexOf("AND");if(orPos!=-1){if(andPos!=-1){if(orPos<andPos)single="OR";elsesingle="AND";}elsesingle="OR";}elseif(andPos!=-1)single="AND";returnsingle;}//无括号子表达式处理方法privatestaticvoidA1(Stringexpress){Stringsingle=A2(express);System.out.println("子表达式:"+express);System.out.println("子表达式操作符:"+single);if("OR".equals(single)){booleanflag=false;String[]strs=express.split("OR");for(inti=0;i<strs.length&&!flag;i++)System.out.println("最小单位表达式:"+strs[i].trim());}elseif("AND".equals(single)){booleanflag=true;String[]strs=express.split("AND");for(inti=0;i<strs.length&&flag;i++)System.out.println("最小单位表达式:"+strs[i].trim());}}privatestaticvoidA4(Stringexpress){StringorAndStr=A2(express);if("OR".equals(orAndStr)){for(inti=express.length();i>0;i=express.length()){if(express.indexOf("(")==0){intpos=A3(express);StringsubExpress=express.substring(1,pos).trim();A4(subExpress);express=express.substring(pos+1,express.length()).trim();if(express.indexOf("OR")==0)express=express.substring(2,express.length()).trim();}elseif(express.indexOf("(")>0){StringsubExpress=express.substring(0,express.indexOf("OR")).trim();A1(subExpress);inta0=express.indexOf("(");intpos=A3(express);express=express.substring(a0+1,pos).trim();}else{if(!"".equals(express)){A1(express);express="";}}}}elseif("AND".equals(orAndStr)){booleanflag=true;for(inti=express.length();i>0&&flag;i=express.length()){if(express.indexOf("(")==0){intpos=A3(express);StringsubExpress=express.substring(1,pos).trim();A4(subExpress);express=express.substring(pos+1,express.length()).trim();if(express.indexOf("AND")==0)express=express.substring(3,express.length()).trim();}elseif(express.indexOf("(")>0){StringsubExpress=express.substring(0,express.indexOf("AND")).trim();A1(subExpress);inta0=express.indexOf("(");intpos=A3(express);express=express.substring(a0+1,pos).trim();}else{if(!"".equals(express)){A1(express);express="";}}}}}publicstaticvoidmain(String[]args){//Stringstr="(Express1AND(Express2ORExpress3))AND(Express4ANDExpress5)";//Stringstr="Express1AND(Express2ANDExpress3)";//Stringstr="Express1OR(Express2ORExpress3)";//Stringstr="Express1ORExpress2ORExpress3";//Stringstr="Express1ANDExpress2ANDExpress3";//Stringstr="(Express1ANDExpress2)AND(Express3ANDExpress4)";//Stringstr="(Express1ANDExpress2)OR(Express3ANDExpress4)";//Stringstr="(Express1OR(Express2ORExpress3))OR(Express4ANDExpress5)";Stringstr="(Express1ANDExpress2)OR(Express3OR(Express4ORExpress6))";//Stringstr="Express1AND(Express2ORExpress3)";System.out.println("表达式:"+str);System.out.println("表达式操作符:"+A2(str));A4(str);}}
解决方案十三:
该方法写的是否合理?是否有更好的思路可解?该解析类调用并发很高,在代码中是否有性能上有更优化的写法?先谢了!
解决方案十四:
引用8楼u014388068的回复:

Quote: 引用6楼u014388068的回复:
Quote: 引用4楼dokia123的回复:
这个很简单啦,首先括号体内的肯定是一个单独的表达式,所以可以分两步:1、先将所有的括号体提取出来,记为子表达式2、将剩下的表达式进行split("and")或者split("or"),这样分割出来的肯定也是子表达式了

如果是括号里面再套括号呢?

针对以下表达式,字符串.split("AND")会产生错乱的现象.(Express1ANDExpress2)AND(Express3ANDExpress4)

上面说了啊,分两步,第一步把括号及其内容提取出来,记为一个字表达式;第二步在split。第二步的时候剩下的表达式已经没有括号了,比如表达式expression1and(expression2andexpression3),第一步提取出(expression2andexpression3)记为一个字表达式;第二步时,针对剩下的表达式,即”expression1and“进行split,这样没问题吧?

时间: 2024-09-17 04:32:36

表达式解析问题的相关文章

算法:一种可扩展的表达式解析及计算方法

概述 在应用软件开发领域,对表达式计算的应用有非常广泛的应用.例如,在报表开发中,经常为 用户提供公式输入功能,从而实现更灵活的报表汇总:工作流应用软件中,经常利用逻辑条件进行动态配置, 从而提供更加灵活的流程配置:另外,在某些 UI 开发中,需要通过某个属性的表达式计算结果来动态控制 UI 组件的显示.所有这些应用都可以归结为一个通用模型,即表达式的解析以及计算.本文旨在提供一种可 扩展的表达式解析及其计算方法. 表达式解析的一般条件及因素 本文所讲的表达式是一种以一 定的运算规则组合所表达的

el表达式-EL表达式解析错误,页面无法展示

问题描述 EL表达式解析错误,页面无法展示 以下的jsp代码中,在Linux服务器上部署工程出现: <c:if test="${switch == 0 || switch == 1}">解析错误!页面无法正常展示,是语法错误吗? <center> <c:set var="switch" scope="session" value="${scoreCleanIp }"/> <c:if t

使用java开发的表达式解析框架有哪些?

问题描述 使用java开发的表达式解析框架有哪些? 对于使用Java开发的表达式解析框架这个问题不是很清楚,不太理解,使用java开发的那些表达式解析框架到底是什么意思呢,到底应该怎么去理解呢?使用java开发的表达式解析框架有哪些? 解决方案 java开发框架_ZK使用笔记二使用 IBATIS 框架开发JAVA GUI 解决方案二: 要解析什么类型的表达式呢,算工表达式是不需要解析的.

js对象根据属性名表达式解析成新的对象

问题描述 js对象根据属性名表达式解析成新的对象 如今有一个对象如下 var obj = { "name": "zhansan", "age": 21, "parent.name": "lisi", "parent.age": 44, "girlfriend[0].name": "fanbinbin", "girlfriend[0].ag

解析Tomcat 6、7在EL表达式解析时存在的一个Bug_java

今天在做数据分页显示的时候遇到了一个问题,经过测试,证实是Tomcat 6的一个bug,我所用的版本为:apache-tomcat-6.0.36,和7.0.30均能复现.下面详细描述一下这个bug: 该bug是在JSTL<c:forEach>标签中发现的,后来分析是EL表达式实现时产生的问题.jsp页面中有一个list需要遍历,这个list的类型为ArrayList<String>,我在其中放置的数据为(为方便我写成数组的形式):["1","...&q

asp利用正表达式解析html的类代码

VBScript5中增加了许多新功能,最振奋人心的当属类和正则表达式的出现.以下是本人写的一个解析html代码的类.我是学php的,语法有不习惯的地方,请大家多包含.<%Class HTMLParse    ' 设置 Initialize 事件.    Private Sub Class_Initialize        myGlobal = True        myIgnoreCase = True    End Sub     Property Let Global(g)    Dim

表达式解析的全部源码 C#版

using System;using System.Collections; namespace XXXXX{ public class Expression {  private Expression() {}   #region No01.表达式分割为ArrayList形式  /// <summary>  /// 要求表达式以空格\t作为分隔符  /// 转换表达式折分为:  /// 变量及数值 ,变量不允许为@  /// 字符串""  /// 运算符号{+.-.*./

C++11 lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capt

转 Lambda表达式解析

(本文转载自:http://www.2cto.com/kf/201404/296631.html) Cocos 2d-x 3.0 版本中引入了C++ 11的特性.其中就包含了回调函中使用Lambda对象. Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的Lambda抽象,是一个匿名函数,即没有函数名的函数. 下面我们来看一段TestCpp中的代码:   在上图的触摸事件的回调函数中,共使用了三次Lambda表达式: [ ](Touch * touch,