如何使用正则表达式解析 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 开头的文字包含 '&amp; 字符,我可以看到没有任何类型的转义,那么查询解析器如何知道文字结束的位置?跨度> 当查询显示subscribers gt '30' 时,为什么结果会显示Operator -&gt; gegegt 不是同一个运算符。 【参考方案1】:

由于问题的框架不是很清楚,我假设您希望匹配 3 给出 Value -&gt; '30' 而不是 Value -&gt; '30'&amp;$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*$ 更改为[^']*$ 并删除引号后的? 即可!

编辑

我注意到在 match 2 中,'Resource' 属性返回了'name'(开头有一个空格),所以我将&lt;Resources&gt;.+? 更改为&lt;Resources&gt;[^ ]+?,从而解决了问题:)

【讨论】:

以上是关于如何使用正则表达式解析 OData 参数?的主要内容,如果未能解决你的问题,请参考以下文章

Scala正则和抽取器:解析方法参数

如何将正则表达式参数传递给 PHP 中的 preg 替换回调?

如何使用正则表达式可移植地解析(Unicode)度数符号?

如何使用Python中的正则表达式解析文件名?

如何使用正则表达式

Python从零开始写爬虫-2 使用正则表达式解析HTML