我确信类似的问题已经得到解答,但无论如何我都会试一试。
我正在尝试编写一些正则表达式来解析过滤器。
但我的正则表现很弱,经过一段时间没有按照我想要的方式工作:
这就是我想要的:
“FirstName eq'John'和LastName eq'Doe'”
“FirstName eq'John'”
“和”
“LastName eq'Doe'”
之后再进一步分解:
“FirstName eq'John'”
现在我有正则表达式来打破它,它按照我想要的方式工作
(\w+)\s*(eq|ne)\s*'?([^']*)'
“姓”
“当量”
“约翰”
但我无法弄清楚上半部分的正则表达式,我也希望能够处理和/或搜索字符串和括号内。
“NickName eq'Jo或Johnny'和Name eq'John'”
“NickName eq'Jo或Johnny'”
“和”
“姓名eq'John'”
“FirstName eq'John'和(LastName eq'Doe'”或Age eq 25)“
“FirstName eq'John'”
“和”
“LastName eq'Doe'”或Age eq 25“
我已经盯着它看了很久,现在我想知道我使用的方法是否值得,任何帮助都会受到赞赏。
答案 0 :(得分:1)
您的过滤器看起来非常简单。正如凯文所说的那样,用比正则表达式更易于维护的东西来解析它是个好主意,同时你也会获得性能提升。 This文章介绍了如何创建自己的表达式解析器。作为解析的结果,您将获得语法树,例如FirstName eq 'John' and LastName eq 'Doe'
过滤器将会出现:
and
/ \
eq eq
/ \ / \
FirstName 'John' LastName 'Doe'
之后,您可以根据您的要求走路并解释AST。
答案 1 :(得分:0)
虽然未明确说明,但您似乎正在尝试使用Regex解析语法。虽然这可能是可能的,但它很少是这项工作的最佳工具。由于看起来你在这个语法中有递归结构,我相信正则表达式是不可能的。
所以......我建议你研究一些全尺寸语法解析器。其中一个工具是ANTLR,尽管有很多。您可以在他们的网站@ http://www.antlr.org/上查看并通过NuGet安装C#版本(https://github.com/tunnelvisionlabs/antlr4cs)
如果ANTLR对于工作来说感觉太重,你也可以在C#中自己动手。