如何使用正则表达式解析OData参数?

时间:2019-05-02 18:15:17

标签: javascript java c# regex

我知道这是很多人问的,但不能解决我的问题

我有一个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**

1 个答案:

答案 0 :(得分:0)

由于问题的框架不是很清楚,所以我假设您希望第3场比赛使用Value -> '30'而不是Value -> '30'&$top=1

您想告诉编译器,最后可能有或没有andor等类似的调节器。但是,您最后添加的部分:(?:\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>[^ ]+?,从而解决了问题:)