c#:如何解析用户查询

本文关键字:用户 查询 何解析 | 更新日期: 2023-09-27 18:06:51

如何将这样的查询解析为sql?或你知道有什么开源解析器可以解析它吗?

(((adsfa ≤ "value") AND (adsfa > "value")) OR (adsfa = "value")) 
AND (adsfa ≤ "value") OR ((adsfa ≤ "value") AND (adsfa ≤ "value")) 
AND (adsfa ≤ "value")

我试着用string.Split(stringSeparators,StringSplitOptions.RemoveEmptyEntries)建立我自己的算法算法变得越来越复杂,但我发现更多的组合,它不能解析。


  • adsfa is列名
  • ≤is操作符
  • "value"为value

更新:谢谢大家,可能我会在下一个版本中使用其中一个解析器

c#:如何解析用户查询

我自己使用Irony库开发了类似的东西。它仍处于alpha阶段,但到目前为止对我来说是稳定的。但请注意,我使用它来解析由其他程序员编写的表达式,而不是用户输入。

这是另一个想法-如果您信任查询的来源,只需要将其转换为适当的SQL,也许几个简单的string.Replace()就足够了?它实际上已经是SQL了,只是操作符是一些奇怪的字符。

如果这些是你唯一需要解析的表达式,你可以用c#手工编写解析器。对于括号,您需要递归,因为您不知道它们可以嵌套多深。看看我不久前写的这篇文章,你也许可以根据自己的需要重写它。

当事情变得更复杂时,手工编写解析器变得困难,那么使用工具包可能会更好。这些天我在FParsec中选择的武器,尽管它是在f#而不是c#中。这是非常非常强大和灵活的。

否则我对ANTLR有很好的经验。

也许你不需要一个完整的解析器等等。告诉我们你到底想做什么,为什么你想读这些表达?也许还有别的办法。

GJ

看起来真的很麻烦。通常我会用f#中的FParsec这样的解析器生成器/组合器库做这样的事情。但是我不认为c#中有这样的东西(Luke Hoben在这里做了类似的事情)

你能在项目的这一部分切换到f#吗?