C#:如何解析用户查询

时间:2011-08-29 14:02:05

标签: c# parsing search

如何解析这样的查询到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是列名
  • ≤是运营商
  • “value”是值

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果这些是您需要解析的唯一表达式,您可以在C#中手动编写解析器。对于需要递归的括号,因为您不知道它们可以嵌套多深。看看this article我写了一段时间,你可以重写它以满足你的需要。

当事情变得更复杂的时候手工编写解析器变得很难,那么你可能更善于使用工具包。这些天我选择的武器在FParsec,虽然它在F#而不是C#中。这是非常强大和灵活的。

另外,我对ANTLR有很好的经验。

也许你不需要一个完整的解析器等。告诉我们你想要做什么,你为什么要阅读这些表达式?也许还有另一种方式。

GJ

答案 2 :(得分:0)

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

您可以为项目的这一部分切换到F#吗?