我知道这是很多人问的,但不能解决我的问题
我有一个odata查询
/items?$filter=name eq 'CARPET T!@#&$%^&*()_+-=~<>?,./:";'[]\{}| APE&1-13/32"X42'' or name eq 'Twitter' and subscribers gt '30'&$top=1
我得到了一个解决方案,但它在最后一个值中添加了下一个参数
(?<Filter>(?<Resource>.+?)\s(?
<Operator>eq|ne|gt|ge|lt|le|add|sub|mul|div|mod|)\s'?(?<Value>.+?)'?)
(?:\s*$|\s+(?:or|and|not))
最后:
**Resource -> subscribers
Operator -> ge
Value -> '30' BUT it give '30'&$top=1**
答案 0 :(得分:0)
由于问题的框架不是很清楚,所以我假设您希望第3场比赛使用Value -> '30'
而不是Value -> '30'&$top=1
您想告诉编译器,最后可能有或没有and
,or
等类似的调节器。但是,您最后添加的部分:(?:\s*$|\s+(?:or|and|not))
只是告诉编译器结尾必须有一个连词或零个或多个空格。
您实际上应该告诉它匹配零个或多个非'
,然后匹配末尾。
(?<Filter>(?<Resource>[^ ]+?)\s(?<Operator>eq|ne|gt|ge|lt|le|add|sub|mul|div|mod|)\s(?<Value>'.+?'))\s*(?:[^']*$|\s+(?:or|and|not))
您可以在https://regex101.com/r/saVoqW/1上查看正则表达式及其结果
您需要做的就是将\s*$
更改为[^']*$
,并在引号后删除?
,您就可以了!
我注意到在比赛2中,“资源”属性返回“名称”(开头带有空格),因此我将<Resources>.+?
更改为<Resources>[^ ]+?
,从而解决了问题:)