Как проанализировать параметры OData с помощью регулярных выражений? - PullRequest
0 голосов
/ 02 мая 2019

Я знаю, что многие спрашивают об этом, но не решают мою проблему

У меня есть запрос оддаты

/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 голосов
/ 02 мая 2019

Поскольку формулировка вопроса не очень ясна, я предполагаю, что вы хотели, чтобы матч 3 дал Value -> '30' вместо Value -> '30'&$top=1

. Вы ХОТИТЕ сказать компилятору, что он может или не может бытьпунктуация типа and, or и т. д. в конце.Но самая последняя часть, которую вы добавили: (?:\s*$|\s+(?:or|and|not)) просто говорит компилятору, что в конце должно быть соединение ИЛИ ноль или более пробелов.

На самом деле вы должны сказать, что оно соответствует нулю или большеnon- ' с последующим концом.

Вот регулярное выражение, которое вы должны использовать:

(?<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*$ на [^']*$ и удалить ? после кавычек, и все готово!

Edit

Я заметил, что вПри совпадении 2 атрибут «Ресурс» возвращал «имя» (с пробелом в начале), поэтому я изменил <Resources>.+? на <Resources>[^ ]+?, тем самым решив проблему:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...