Java将String解析为Query

时间:2015-11-26 13:49:57

标签: java parsing

我们有二维的整数数组:

int[][] XYZ = new int[][]{
              { 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 2, 3, 4, 5, 6, 7, 8 },
              { 8, 7, 6, 5, 4, 3, 2, 1 },
              { 2, 2, 2, 2, 2, 2, 2, 2 },
              { 1, 2, 3, 4, 5, 6, 7, 8 }
            }; 

和一个字符串:

String zapytanie = "((XYZ[i][0]==3 && XYZ[i][1]==4) || (XYZ[i][1]==3 || XYZ[i][2]==7))"

动态生成查询并传递给String。

我想要做的是解析这个String而不添加 外部工具/组件。

for(int i=0;i<XYZ.length;i++)
                    {
                        //todo  parse here this expression
                    } 

我们希望找到与String中的查询匹配的所有行并返回它们。

我的问题是我不知道如何将String解析为Query。就像从字符串zapytanie中删除这个“”并执行它一样。

我很确定我不能使用eval,但仍然需要学习新东西,所以我尝试了它:)

首次导入

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

第二

            ScriptEngineManager factory = new ScriptEngineManager();
            ScriptEngine engine = factory.getEngineByName("JavaScript");

            for(int i=0;i<XYZ.length;i++)
            {
                engine.eval(zapytanie);
            }

错误:ReferenceError: "XYZ" is not defined.

知道如何解决这个错误,你能告诉我其他方法在不使用javascript的情况下完成任务吗?

我从我的查询中创建了一个后序树,但我想知道是否有更快的方法,然后使用这个树:

a是XYZ [i] [0],b是XYZ [i] [1],依此类推。

来自zapytanie = ((a=3 and b=4) or (b=3 or c=7))

http://i.imgur.com/T6gjT5W.png

我不知道如何使用这种树智能方式

2 个答案:

答案 0 :(得分:0)

一个选项是使用Here,但我不建议在现实生活中使用它,因为它是一个巨大的安全漏洞。

如果您不能使用eval,那么我认为您需要自己教授解析器,特别是eval我要说。

答案 1 :(得分:0)

我自己想出来了:)

  1. 让我们说查询是((a<=1 and b=4) or (b=2 and c=7))。我们从用户输入中获取query作为String
  2. 来自数据库 a is XYZ[i][0]

    b is XYZ[i][1]int[][] array等等。

    1. 首先我做的是检查查询是否正常 - 关于左/右括号的数量。如果没有,那就停在这里。

    2. 我将查询从String更改为等于((a<=1 and b=4) or (b=2 and c=7))反向波兰表示法所以现在我的String等于a<=1 b=4 and b=2 c=7 and or

    3. RPN是延迟订购的。我创建了一个关于这个顺序的树,并为JTree添加了元素。 它看起来像这样:http://i.imgur.com/AK9hw6M.png

    4. 我以后序方式旅行我的树并解析每个项目。

      如果我找到andor之类的运算符,我会将其中的2个子节点用作上面的运算符的逻辑运算符之一,因此:&&||

    5. 在最后我有一个只有Boolean值的root,告诉使用这行是否合适。

      1. 如果没问题 - 那么我们写下那一行。