我有自定义 NoSql 解决方案的示例 where 子句,如下
Name.Contains('between') and (DateField in ('2020-12-01', null)) And Name = 'test' and Product.Name != 'P1'
我需要找到所有条件组,并且每个条件组都想检测左字段、运算符和值以将它们转换为 MySql 语法
Name.Contains('between')
=> Name
、Contains
和 'between'
(DateTimeField in ('2020-12-01', null))
=> DateField
、in
和 '2020-12-01', null
Name = 'test'
=> Name
、=
和 test
Product.Name != 'P1'
=> Product.Name
, !=
, P1
此处字段可以使用不带点 (.) 的符号,例如
Name
、Product.Name
等等...
此外,操作可以带或不带点(.)符号,例如
.Contains
、.StartsWith
、In
、!=
、=
等...
只有带
StartsWith|EndsWith|Contains|In
的值才会用大括号括起来,其他值将用单引号括起来
我设法拥有 2 个独立的正则表达式,一个用于 In,另一个用于其他运算符,但对于组合和重叠场景,它无法按预期工作
In 模式的正则表达式:
@"(?:\b(?:\w+)\.)?(\w+)\s*(\b(?:IN)\b)\s*\(([^)]+)\)"
,此处无法检测带点符号的字段
其他运算符的第二个正则表达式:
@"(\b(?:\w+)\.)?(\b(?:Contains|StartsWith|EndsWith)\b)\(([^)]+)\)"
,这个正则表达式仅检测带有点符号最多一级的字段
我正在寻找单个/多个正则表达式来满足上述所有场景。
要检测具有多个级别的字段,请使用以下正则表达式:
((?:\w+(?:\.\w+)*)|\w+)\b(?<!\.(?:Contains|EndsWith|StartsWith))