正则表达式从自定义查询表达式的条件中查找字段、子字段、运算符和值

问题描述 投票:0回答:1

我有自定义 NoSql 解决方案的示例 where 子句,如下

Name.Contains('between') and (DateField in ('2020-12-01', null)) And Name = 'test' and Product.Name != 'P1'

我需要找到所有条件组,并且每个条件组都想检测左字段、运算符和值以将它们转换为 MySql 语法

  1. Name.Contains('between')
    =>
    Name
    Contains
    'between'
  2. (DateTimeField in ('2020-12-01', null))
    =>
    DateField
    in
    '2020-12-01', null
  3. Name = 'test'
    =>
    Name
    =
    test
  4. 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)\(([^)]+)\)"
,这个正则表达式仅检测带有点符号最多一级的字段

我正在寻找单个/多个正则表达式来满足上述所有场景。

c# .net regex regex-group
1个回答
0
投票

要检测具有多个级别的字段,请使用以下正则表达式:

((?:\w+(?:\.\w+)*)|\w+)\b(?<!\.(?:Contains|EndsWith|StartsWith))

© www.soinside.com 2019 - 2024. All rights reserved.