如何使用正则表达式解析 OData 参数?
Posted
技术标签:
【中文标题】如何使用正则表达式解析 OData 参数?【英文标题】:How to parse OData parameters using regex? 【发布时间】:2019-09-21 07:22:40 【问题描述】:我知道很多人都问过这个问题,但没有解决我的问题
我有一个 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**
【问题讨论】:
它是哪种语言:javascript、Java 还是 C#? 不知道 odata,但这似乎是一个无效的查询。似乎字符串文字是单引号的,但以CARPET
开头的文字包含 '
和 &
字符,我可以看到没有任何类型的转义,那么查询解析器如何知道文字结束的位置?跨度>
当查询显示subscribers gt '30'
时,为什么结果会显示Operator -> ge
? ge
和 gt
不是同一个运算符。
【参考方案1】:
由于问题的框架不是很清楚,我假设您希望匹配 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*$
更改为[^']*$
并删除引号后的?
即可!
编辑
我注意到在 match 2 中,'Resource' 属性返回了'name'(开头有一个空格),所以我将<Resources>.+?
更改为<Resources>[^ ]+?
,从而解决了问题:)
【讨论】:
以上是关于如何使用正则表达式解析 OData 参数?的主要内容,如果未能解决你的问题,请参考以下文章