C#Regex用括号过滤

时间:2016-02-26 19:48:56

标签: c# regex

我确信类似的问题已经得到解答,但无论如何我都会试一试。

我正在尝试编写一些正则表达式来解析过滤器。

但我的正则表现很弱,经过一段时间没有按照我想要的方式工作:

这就是我想要的:

“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“

我已经盯着它看了很久,现在我想知道我使用的方法是否值得,任何帮助都会受到赞赏。

2 个答案:

答案 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#中自己动手。