我需要使用正則運算式驗證過濾輸入,該正則運算式將用于使用輸入模型的類中欄位的[RegularExpression]屬性。Filter輸入具有以下格式:
[property]~[predicate]~[value]
例如:
lastname~eq~'John'
并且還可以應用多次過濾:
[property]~[predicate]~[value]~[logicaloperator]~[property]~[predicate]~[value] ...
例如:
lastname~eq~'Doe'~and~firstname~eq~'John'~or~firstname~eq~'Jane'
我必須確保如果使用邏輯運算子,那么它們后面會跟著相同的模式。我嘗試使用命名組和lookbehinds,但我無法讓它正常作業。
我創建了以下正則運算式:
((((\w )~(\blt\b|\blte\b|\beq\b|\bgt\b|\bgte\b|\bneq\b|\bcontains\b)~(.\w .))(~(\bor\b|\band\b)~)?((\w )~(\blt\b|\blte\b|\beq\b|\bgt\b|\bgte\b|\bneq\b|\bcontains\b)~(.\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
任何想法如何使這項作業?
uj5u.com熱心網友回復:
您可以使用
^\w ~(?:lte?|n?eq|gte?|contains)~['"][^'"] ['"](?:~(?:and|or)~\w ~(?:lte?|n?eq|gte?|contains)~['"][^'"] ['"])*$
要么,
^(?:\w ~(?:lte?|n?eq|gte?|contains)~['"][^'"] ['"](?:~(?:and|or)~(?!$)|$)) $
請參閱正則運算式演示。
請注意,正則運算式演示中的$前綴是\r?因為該字串是具有 CRLF 行結尾的多行字串,并且RegexOptions.Multiline啟用了選項。
模式匹配
^- 字串的開始\w- 一個或多個單詞字符~- 一個~字符(?:lte?|n?eq|gte?|contains)- 謂詞模式(lt,lte,gt,gte,neq,eq,contains~- 一個~字符['"][^'"] ['"]- a'or",然后是一個或多個除'and以外的字符",然后是 a"or'(?:- 非捕獲組的開始~(?:and|or)~-~,andoror, 和一個~字符\w ~(?:lte?|n?eq|gte?|contains)~['"][^'"] ['"]- 如上所述
)*- 零次或多次重復$- 字串結束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455886.html
