Поскольку формулировка вопроса не очень ясна, я предполагаю, что вы хотели, чтобы матч 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>[^ ]+?
, тем самым решив проблему:)