解析有关搜索条件的用户输入

时间:2009-11-24 12:41:30

标签: java search parsing user-input

我正在寻找解析一些用户输入的方法。输入应显示必须执行的搜索以及必须如何组合。

  • 1 AND 2
  • (3 AND 2)OR 1
  • (3 AND 2)OR(1 AND 4)
  • ((3 OR 4)AND 1)OR 2

第一个例子应该以AND方式组合搜索1和2的结果。第二个例子应该以AND方式组合搜索3和2的结果,并以OR方式将该组合的结果组合到搜索1的结果中。等

关于如何做到这一点的任何想法?

5 个答案:

答案 0 :(得分:2)

将您的“结果”视为一个对象,它在以下界面中提供和/或类似的方法:

public interface AndOrCapable<T> {
  public T and(T anOtherResult);
  public T or(T anOtherResult);
}

然后,您可以将用户输入转换为:

Result total = r2.or(r1.and(r3.or(r4))); // your fourth example

这只是为了澄清这个概念 - 在你的情况下,你需要一个动态评估器,因为你使用了用户输入。

因此,您仍然需要验证器/解析器将用户输入转换为(语法)树,这将是您用来计算总计的模型。

希望它有所帮助!

答案 1 :(得分:2)

JavaCC是一个很好的工具,用于为此生成解析器。或者,如果您可以稍微更改语法,则可以使用方案解释器使用java编写脚本工具,例如。

( (3 OR 4) AND 1) OR 2

变为

(OR (AND (OR 3 4) 1) 2)

然后你只需要实现AND / OR

答案 2 :(得分:1)

关于如何为通用关键字搜索创建解析器的一些灵感......

即使你标记了问题 java ,这里也是python中searchparser的一个例子。它使用pyparsing,一个解析器生成器,它接受语法并创建代码,可以运行解析器用户输入。

https://github.com/pyparsing/pyparsing/blob/master/examples/searchparser.py

293行代码,包括测试套件。也许它可以帮助你作为一个起点......

答案 3 :(得分:1)

干净的解决方案是编写中缀解析器;网上有很多代码示例。在您的示例中,更简单的算法可能就足够了,因为您不需要运算符优先级等。

作为编码注释:StreamTokenizer类可以帮助您解析输入字符串。

答案 4 :(得分:1)

在实现端(一旦你有一个解析器,组织和执行搜索):

  1. 如何创建Condition树,其中Condition个对象可能是简单条件,或复合条件将两个简单条件与一个布尔(IE ANDCondition父节点与子节点连接起来RangeConditionEqualsCondition)。

    然后根据每个项目评估树的顶部。此解决方案是O(mn),其中m是条件数,n是要搜索的项目数,但您可以通过删除冗余条件来优化此项。如果第一个条件消除了大多数项目,它会快得多。

  2. 版本2:为每个项目(例如,数组索引)分配唯一键,并对每个条件执行搜索,为每个条件构建HashSet<Key>。然后,从最小的必需键开始,删除或添加每个条件的键,直到获得最终结果。这可能比上述更快,具体取决于。

  3. 注意:这些方法模仿SQL数据库的运行方式 - 如果您的系统足够大或复杂,您应该调查使用数据库而不是编写自己的代码来执行相同的操作。