使用中带有可选参数的regex匹配重复组.NET



我需要使用正则表达式验证筛选输入,该正则表达式将用于使用输入模型的类中Filter字段上的[RegularExpression]属性。输入具有以下格式:

[property]~[predicate]~[value]

例如:

lastname~eq~'John'

并且还可以应用n次多重滤波:

[property]~[predicate]~[value]~[logicaloperator]~[property]~[predicate]~[value] ...

例如:

lastname~eq~'Doe'~and~firstname~eq~'John'~or~firstname~eq~'Jane'

我必须确保,如果使用逻辑运算符,那么它们遵循相同的模式。我尝试使用命名组和lookbehinds,但无法正常工作。

我创建了以下正则表达式:

((((w+)~(bltb|blteb|beqb|bgtb|bgteb|bneqb|bcontainsb)~(.w+.))(~(borb|bandb)~)?((w+)~(bltb|blteb|beqb|bgtb|bgteb|bneqb|bcontainsb)~(.w+.))?)+)

只有当输入有效时,我才能使其匹配。我尝试实现的组的一般模式是:

(main group-
(property group-any word)~(predicate group-list of operators)~(value -any value)
)
(~(logic operator)~)
(main group)

目标行为:

有效输入:

lastname~eq~'Doe'                                                      -> should match
lastname~eq~'Doe'~and~firstname~eq~'John'                              -> should match
lastname~eq~'Doe'~and~firstname~eq~'John'~or~firstname~eq~'Jane'        -> should match

无效输入:

lastname~eq~                                          ->should not match
lastname~eq~'Doe'~and~firstname~eq                    ->should not match
lastname~eq~'Doe'~and~firstname~eq~John~              ->should not match
lastname~eq~'Doe'~and~firstname~eq~John~or~           ->should not match

有什么办法让它发挥作用吗?

您可以使用

^w+~(?:lte?|n?eq|gte?|contains)~['"][^'"]+['"](?:~(?:and|or)~w+~(?:lte?|n?eq|gte?|contains)~['"][^'"]+['"])*$

或者,

^(?:w+~(?:lte?|n?eq|gte?|contains)~['"][^'"]+['"](?:~(?:and|or)~(?!$)|$))+$

请参阅regex演示。

请注意,在regex演示中,$前面是r?,因为该字符串是一个以CRLF行结尾的多行字符串,并且启用了RegexOptions.Multiline选项。

图案与匹配

  • ^-字符串的开头
  • w+-一个或多个单词字符
  • ~-一个~字符
  • (?:lte?|n?eq|gte?|contains)-谓词模式(ltltegtgteneqeqcontains
  • ~-~字符
  • ['"][^'"]+['"]-'",然后是除'"之外的一个或多个字符,然后是"'
  • (?:-非捕获组的启动
    • ~(?:and|or)~-~andor,以及一个~字符
    • w+~(?:lte?|n?eq|gte?|contains)~['"][^'"]+['"]-如上所述
  • )*-零次或多次重复
  • $—字符串结束

最新更新