用于使用括号进行筛选的 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"
我已经盯着它看了这么久,现在我想知道我使用的方法是否值得任何帮助,将不胜感激。
您的过滤器看起来像非常简单的表达式。正如 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 觉得工作太重。