В моем 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)
Я почти уверен, что есть другие проблемы с регулярным выражением, которые я еще не обнаружил ...