Apache Ant 样式的路径有三种通配符匹配方法,利用它们可以组合出多种路径模式:
通配符 | 说明 |
---|---|
? | 匹配任何单字符 |
* | 匹配0或者任意数量的字符 |
** | 匹配0或者更多的目录 |
URL路径 | 说明 |
---|---|
/app/*.x | 匹配(Matches)所有在app路径下的.x文件 |
/app/p?ttern | 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern |
/**/example | 匹配(Matches) /app/example, /app/foo/example, 和 /example |
/app/**/dir/file.* | 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java |
/**/*.jsp | 匹配(Matches)任何的.jsp 文件 |
需要注意的是,路径匹配遵循最长匹配原则(has more characters),例如/app/dir/file.jsp
符合/**/*.jsp
和/app/dir/*.jsp
两个路径模式,那么最终就是根据后者来匹配。
序号 | 规则 | 备注 |
---|---|---|
1 | 必须以 / 开头 | 该规则的检测已用正则实现 |
2 | 必须不以 / 结尾 | 该规则的检测已用正则实现 |
3 | 任意两个 / 不能相连 | 例如,不允许出现 //abc 的形式;该规则的检测已用正则实现 |
4 | 必须使用 RFC3986 文档规定的符号 | 该规则的检测已用正则实现 |
5 | 在一节中,可以同时出现 * 和 ? ,但不推荐 * 和 ? 连用 | 例如,/*??b 等同于 /*b ,显然后面的形式更简单 |
6 | 在一节中,可以出现或连续出现 [0-n] 个? | 例如,/a??b ,将匹配/a11b ,但不匹配/a1b |
7 | 在一节中,可以出现 [0-n] 个* | 例如,/*a*b ,将匹配/1a2b |
8 | 在一节中,如果出现了 2 个 * ,则该节不推荐存在任何其它字符 | 例如,不推荐出现 /a/**b/b 的形式,推荐 /a/**/b 的形式,原因见下一规则;该规则的检测在前端中使用 JavaScript 实现 |
9 | 在一节中,连续出现[2,n] 个 * 和其它字符,效果等同于只使用 1 个 * | 经过试验,连续出现 2 个及以上的 * 时的效果等同于只使用 1 个 * ,例如/**a/b 等同于/*a/b |
*RFC3986 介绍:见外部网站:网址URL中特殊字符转义编码 https://blog.csdn.net/p312011150/article/details/78928003
**一节:以 /
开头到下一个 /
之前的字符串,如 /abc/def
中 abc
为一节,def
为一节
JS脚本:
var pattern = /^(\/[A-Za-z0-9*?#._~:@!$&'+,;%=\-\[\]\(\)]+)(\/[A-Za-z0-9*?#._~:@!$&'+,;%=\-\[\]\(\)]+)*$/g pattern.test();
public class AntPathMatcherTest { private AntPathMatcher pathMatcher = new AntPathMatcher(); @Test public void test() { pathMatcher.setCachePatterns(true); pathMatcher.setCaseSensitive(true); pathMatcher.setTrimTokens(true); pathMatcher.setPathSeparator("/"); Assert.assertTrue(pathMatcher.match("/*", "/test")); Assert.assertTrue(pathMatcher.match("/test*/**/tt", "/test1/t/b/tt")); Assert.assertTrue(pathMatcher.match("/*/*", "/test/test")); } }
发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)