我需要使用正则表达式验证筛选输入,该正则表达式将用于使用输入模型的类中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)
-谓词模式(lt
、lte
、gt
、gte
、neq
、eq
、contains
~
-~
字符['"][^'"]+['"]
-'
或"
,然后是除'
和"
之外的一个或多个字符,然后是"
或'
(?:
-非捕获组的启动~(?:and|or)~
-~
、and
或or
,以及一个~
字符w+~(?:lte?|n?eq|gte?|contains)~['"][^'"]+['"]
-如上所述
)*
-零次或多次重复$
—字符串结束