正则表达式匹配确切的字符串包含单词

时间:2019-01-30 14:31:40

标签: java regex string

我想“捕获”下一条路径以对其执行操作:

/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

所以我必须在matchs函数中做一些错误的事情。 这样做应该有帮助吗?

2 个答案:

答案 0 :(得分:0)

我成功了:

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

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

那么它们之间的区别(\\w*[^/]+)是什么?

答案 1 :(得分:0)

.*greedy,因此它占用了users//content之间的所有内容。

使用[^/]捕获/users/之间不是/content的所有内容。或者,您可以通过添加问号(.*)来制作? lazy

“贪婪”量词将尝试匹配尽可能多的令牌。 “惰性”量词将在第一个马赫数处停止。 在某些情况下,贪婪的量词的效率也会低得多,因为正则表达式引擎将在实际良好匹配之后尝试匹配更多(或更多)令牌。并且只有在发生某些故障后才会追溯。