Java шаблон регулярного выражения для фильтра REST / параметра поиска? - PullRequest
0 голосов
/ 05 марта 2020

В моем REST API есть параметр фильтра, который может выглядеть следующим образом:

owner='bob'                            // owner is bob
owner!'bob'                            // owner is not bob
owner.town='bel*'                      // owner's town starts with bel
owner.town='*bel*'                     // owner's town contains bel
owner.car='{ some json blob here}'     // owner's car equals some json blob
owner.car~                             // owner has a property named car

Итак, я хочу получить:

  • Требуемый ключ строки
  • Может содержать буквы, цифры, подчеркивания, точки, дефисы или двоеточия
  • Обязательный оператор: + |! | ~
  • Необязательное значение, которое может начинаться и / или заканчиваться на необязательная звездочка
  • Если присутствует необязательное значение, оно должно быть заключено в одинарные кавычки

Я начал со следующего, но это не возвращает то, что я ожидал:

String filter = "owner='bob'";
Pattern.compile("(\\w+?)(=|!|~)(*?)(\\w+?)(*?)");
final Matcher matcher = pattern.matcher(filter);

// Results
matcher.group(1)   // "owner"
matcher.group(2)   // "="
matcher.group(3)   // "\"
matcher.group(4)   // ""
matcher.group(5)   // "bob"
matcher.group(6)   // ""
matcher.group(7)   // "\"

Проблемы, которые у меня возникают:

  • Я не думаю, что (*?) правильно захватывает ноль или одну звездочку
  • Передача "владельца ~" приводит к ошибка при вызове matcher.group(anything)

Я почти уверен, что есть другие проблемы с регулярным выражением, которые я еще не обнаружил ...

1 Ответ

1 голос
/ 05 марта 2020

Я бы использовал следующее регулярное выражение:

^([\w.:-]+)([=!~])('.*')?$

Он состоит из трех последовательных групп, определенных следующим образом:

  • первая группа соответствует ключу, который не является -пустая последовательность букв, цифр, подчеркиваний, точек, дефисов или двоеточий.
  • вторая группа соответствует оператору, который является одним из "=", "!" или "~"
  • третья необязательная группа соответствует остальной части, которая будет значением свойства, если оператор не является "~"

Вы можете попробовать это здесь .

Обратите внимание, что если упоминание о том, что значение может начинаться или заканчиваться на *, подразумевает, что оно не может содержать * в других местах, вы захотите изменить третье. сгруппировать в ('\*?[^*]*\*?').

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