Регулярное выражение соответствует точной строке содержит слово - PullRequest
0 голосов
/ 30 января 2019

Я хочу "поймать" следующий путь, чтобы выполнить с ним какие-либо действия:

/root/m/api/users/<user-id-can be any combination of characters and digits>/content

Путь должен заканчиваться на content

Например:

/root/m/api/users/acme/content

Для этого мне нужно сопоставить регулярное выражение, чтобы узнать, правильный ли это путь:

private boolean isPathAllow(final String urlToBlock) {
    Matcher matcher = Pattern.compile("^/root/m/api/users/.*/content$").matcher(urlToBlock);
    return matcher.matches();
}

Но он возвращает true даже при таких запросах, как:

/root/m/api/users/acme/applications/versions/1.0/content

Так что ядолжен сделать что-то не так в функции совпадений.Любая помощь, чтобы сделать это, как это должно быть?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

.* - это жадный , поэтому требуется все от users/ до /content.

Используйте [^/], чтобы поймать все, что не / между users/и /content.Или вы можете сделать .* ленивым , добавив знак вопроса (?).

Жадный квантификатор попытается сопоставить максимально возможное количество жетонов.«Ленивый» квантификатор остановится на первом махе.В некоторых случаях жадные квантификаторы также могут быть гораздо менее эффективными, так как движок регулярных выражений будет пытаться сопоставить больше (или намного больше) токенов после фактического хорошего соответствия.И вернет трассировку только после определенного сбоя.

0 голосов
/ 30 января 2019

У меня получилось:

Matcher matcher = Pattern.compile("^/root/m/api/users/\\w*/content$").matcher(urlToBlock);

или

Matcher matcher = Pattern.compile("^/root/m/api/users/[^/]+/content$").matcher(urlToBlock);

Так в чем же разница между ними (\\w* против [^/]+)?

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