1 Ant 通配符
Apache Ant 样式的路径有三种通配符匹配方法,利用它们可以组合出多种路径模式:
| 通配符 | 说明 |
|---|---|
| ? | 匹配任何单字符 |
| * | 匹配0或者任意数量的字符 |
| ** | 匹配0或者更多的目录 |
2 匹配路径示例
| 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两个路径模式,那么最终就是根据后者来匹配。
3 检测字符串是否为 Ant 风格 URL
3.1 基本规则
| 序号 | 规则 | 备注 |
|---|---|---|
| 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为一节
3.2 JavaScript 正则检测规则
JS脚本:
var pattern = /^(\/[A-Za-z0-9*?#._~:@!$&'+,;%=\-\[\]\(\)]+)(\/[A-Za-z0-9*?#._~:@!$&'+,;%=\-\[\]\(\)]+)*$/g
pattern.test();
4 在 Java 中检测是否匹配 Ant URL
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"));
}
}

407

被折叠的 条评论
为什么被折叠?



