【问题标题】:How to parse OData parameters using regex?如何使用正则表达式解析 OData 参数?
【发布时间】: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 不是同一个运算符。

标签: javascript java c# regex


【解决方案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;[^ ]+?,从而解决了问题:)

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多