用于使用括号进行筛选的 C# 正则表达式

本文关键字:筛选 正则表达式 用于 | 更新日期: 2023-09-27 18:36:21

我相信类似的问题已经得到了回答,但无论如何我都会尝试一下。

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

但是我的正则表达式很弱,玩了一段时间后没有按照我想要的方式工作:

这就是我想要的:

"FirstName eq 'John' and LastName eq 'Doe'"

"名字等式'约翰'"

"和"

"姓氏 eq 'Doe'"

然后进一步分解:

"名字等式'约翰'"

现在我有正则表达式来分解它,它以我想要的方式工作

('w+)'s*(eq|ne)'s*'?([^']*)'

"名字"

"情商"

"约翰"

但是我无法弄清楚前半部分的正则表达式,我也希望能够处理和/或在搜索字符串和括号内。

"昵称 eq '乔或约翰尼' 和名字 eq '约翰'"

"昵称eq'乔或约翰尼'"

"和"

"名字eq'约翰'"

"FirstName eq 'John' and (LastName eq 'Doe'" 或 Age eq 25)"

"名字等式'约翰'"

"和"

"姓氏等额'Doe'"或年龄等值25"

我已经盯着它看了这么久,现在我想知道我使用的方法是否值得任何帮助,将不胜感激。

用于使用括号进行筛选的 C# 正则表达式

您的过滤器看起来像非常简单的表达式。正如 Kevin 所说,使用比正则表达式更易于维护的东西来解析它是一个好主意,您还将获得性能提升。本文介绍如何创建自己的表达式分析器。解析的结果是,您将获得语法树,例如FirstName eq 'John' and LastName eq 'Doe'过滤器将有:

                 and
          /                '
        eq                  eq
      /    '             /     '
FirstName  'John'    LastName  'Doe'

之后,您可以根据需要进行行走和解释AST。

虽然没有明确说明,但看起来您正在尝试使用正则表达式解析语法。虽然这可能是可能的,但它很少是这项工作的最佳工具。由于您似乎在此语法中具有递归结构,因此我相信正则表达式是不可能的。

所以。。。我建议你研究一些完整的语法解析器。一个这样的工具是ANTLR,尽管有很多。您可以在他们的网站 @ http://www.antlr.org/上查看它,并通过 NuGet 安装 C# 版本 (https://github.com/tunnelvisionlabs/antlr4cs)

你也可以在 C# 中滚动自己的工作,如果 ANTLR 觉得工作太重。