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
更新:谢谢大家,可能我会在下一个版本中使用其中一个解析器
我自己使用Irony库开发了类似的东西。它仍处于alpha阶段,但到目前为止对我来说是稳定的。但请注意,我使用它来解析由其他程序员编写的表达式,而不是用户输入。
这是另一个想法-如果您信任查询的来源,只需要将其转换为适当的SQL,也许几个简单的string.Replace()
就足够了?它实际上已经是SQL了,只是操作符是一些奇怪的字符。
如果这些是你唯一需要解析的表达式,你可以用c#手工编写解析器。对于括号,您需要递归,因为您不知道它们可以嵌套多深。看看我不久前写的这篇文章,你也许可以根据自己的需要重写它。
当事情变得更复杂时,手工编写解析器变得困难,那么使用工具包可能会更好。这些天我在FParsec中选择的武器,尽管它是在f#而不是c#中。这是非常非常强大和灵活的。
否则我对ANTLR有很好的经验。
也许你不需要一个完整的解析器等等。告诉我们你到底想做什么,为什么你想读这些表达?也许还有别的办法。
GJ
看起来真的很麻烦。通常我会用f#中的FParsec这样的解析器生成器/组合器库做这样的事情。但是我不认为c#中有这样的东西(Luke Hoben在这里做了类似的事情)
你能在项目的这一部分切换到f#吗?