我给出了一个包含几种不同数据组合的字符串。
例如:
string data =“(年龄= 20& gender =男性)或(city = newyork)”
string data1 =“(job = engineer& gender = female)”
string data2 =“(foo = 1或foo = 2)&(bar = 1)”
我需要解析这个字符串并从中创建结构,我必须将其评估为另一个对象的条件。例如:如果对象具有这些属性,则执行某些操作,否则跳过等。
执行此操作的最佳做法是什么?
我应该使用诸如antlr之类的解析器并从字符串中生成令牌。等?
提醒:这个字符串的创建方式有几种组合。但它全部和/或。答案 0 :(得分:2)
像ANTLR这样的东西可能有点过头了。
shunting-yard algorithm的一个简单实现可能会很好地解决这个问题。
答案 1 :(得分:1)
如果示例非常简单,则使用正则表达式可能会有效,但它更可能导致无法维护的代码。使用其他一些解析方法似乎是一个好主意。
我会看一下NCalc - 它主要集中在解析数学表达式,但它似乎是可以自定义的(你可以指定你的函数和常量),所以它可以在你的场景也是如此。
如果这对您来说太复杂,您可以使用任何“解析器生成器”来实现C#。使用ANTLR是一个很好的选择 - 这是一个示例,展示如何开始编写类似于示例的内容Five minute introduction to ANTLR
您也可以尝试使用F#,这是解决此类问题的绝佳语言。请参阅Chris Smith的示例FsLex Sample,它显示了一个简单的数学计算器 - 在F#中处理解析的表达式比在C#中容易得多。在F#中,您也可以使用FParsec,它非常轻量级,但如果您不习惯F#,可能会有点难以理解。
答案 2 :(得分:0)
似乎您可能希望使用正则表达式来执行此操作。
阅读.NET中的正则表达式。这是一些好文章:
在编写/测试正则表达式时,我强烈建议您使用RegExLib.com的regex tester。
答案 3 :(得分:0)
答案 4 :(得分:0)
Antlr是一个很棒的工具,但您可以使用正则表达式执行此操作。 .NET正则表达式引擎的一个好处是支持嵌套构造。参见
http://retkomma.wordpress.com/2007/10/30/nested-regular-expressions-explained/