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

标签 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**

最佳答案

由于问题的框架不是很清楚,我假设您希望第 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/

相关文章:

java - 收集所有 CompletableFuture.allOf 的可抛出对象

c# - 在 ICSharpCode 文本编辑器中选择文本

c# - 根据屏幕大小调整 WPF 窗口大小

java - Android:在选项卡布局中使用 ListActivity 时出错

c# - Windows窗体中多对多关系的数据输入

javascript - Netflix Falcor 与 Immutable.js 一起工作?

javascript - 从 Three.js 中的 .dae 获取所有节点名称

javascript - Soundcloud SDK 3. 最喜欢的(喜欢的)歌曲的不间断流

javascript - 如何使用 OAuth 在 chrome 扩展中获取唯一用户 ID?

java - OWLAPI : Use of 'Imports' enum