6

我正在开发一个项目,用户使用 AND OR 运算符输入人类可读的搜索字符串。我举三个例子

  1. a AND (b OR c) -> (?=. \ba\b)(?=. (\bb\b)|(\bc\b)).*
  2. 一个或(b 和 c)
  3. (a 或 b) 与 (c 或 d)

以上是我可能得到的输入样本。我想接受该输入并将其转换为正则表达式。这不是编译器的示例吗?看着它,我看到我想做的是将高级命令转换为低级命令。您对我如何完成上述工作有什么建议吗?我想要的是,将生成的正则表达式传递给 jsoup(伪选择器:matchesOwn)并查询 html 文档。感谢您的帮助。

4

1 回答 1

5

这样做的一般方法是以易于遍历的数据结构的形式制作中间表示。这通常称为 AST。如果您不熟悉这个概念,请查看calculator-ast,它为计算器语言进行了这种转换。

为了将用户输入的字符串转换为 AST,您需要使用解析器。你可以看看antlr。我个人用的是v3,v4好像还不够成熟。看看antlr3.org。如果您想自己编写解析器,您可以尝试使用pratt 解析器。这不是微不足道的,并且结合良好的错误处理需要时间,但它可以是一个有趣的练习。

一旦有了 AST,通过遍历 AST 并在进行过程中输出字符,将其转换为正则表达式应该是微不足道的。

祝你好运!

于 2013-03-16T12:11:16.153 回答