我知道很多人问这个问题,但没有解决我的问题
我有一个 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**
最佳答案
由于问题的框架不是很清楚,我假设您希望第 3 场比赛给出 Value -> '30'
而不是Value -> '30'&$top=1
你想告诉编译器可能有也可能没有像 and
这样的 punbctuator , 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>[^ ]+?
,从而解决问题:)
关于javascript - 如何使用正则表达式解析OData参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958069/