IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> URL匹配之AntPathMatcher -> 正文阅读

[Java知识库]URL匹配之AntPathMatcher

URL匹配之AntPathMatcher

背景说明

Ant匹配模式是当下(2022-03-18)最火的对URL进行匹配的模式。很多框架都采用AntURL进行匹配,如Spring框架中的org.springframework.util.AntPathMatcher
在这里插入图片描述

Ant基础通配符简介

通配符介绍示例说明
?匹配1个字符模板:/jd/a?c
匹配示例:/jd/abc
不匹配示例1:/jd/ac
不匹配示例2:/jd/axyzc
*匹配>=0个字符模板:/jd/a*c
匹配示例1:/jd/ac
匹配示例2:/jd/abc
匹配示例3:/jd/axyzc
不匹配示例1:/jd/a
不匹配示例2:/jd/xc
不匹配示例3:/jk/ac
**匹配>=0个目录示例1:/**/abc.html匹配所有以abc.html结尾的路径
示例2:/abc/**匹配所有以/abc/打头的路径
示例3:abc**匹配所有以abc打头的路径
示例4:/xyz/**/qwer匹配所有以/xyz/打头并以/qwer结尾的路径

AntPathMatcher常用方法介绍及示例

提示:以下内容基于spring 5.3.12

常用的构造方法

  • 示例

    // 无参构造,默认以 "/" 作为路径分隔符
    AntPathMatcher antPathMatcher = new AntPathMatcher();
    // 也可以指定路径分隔符
    antPathMatcher = new AntPathMatcher("-");
    

extractUriTemplateVariables(String pattern, String path):根据pattern的规则,从path中抽取对应的变量值

当pattern与path不匹配时,会报错

  • 示例一

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    Map<String, String> map = antPathMatcher.extractUriTemplateVariables("/root/{a}/{b}/{c}/{d}.html", "/root/aa/bb/cc/xyz.html");
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    

    输出

    a=aa
    b=bb
    c=cc
    d=xyz
    
  • 示例二

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    Map<String, String> map = antPathMatcher.extractUriTemplateVariables("/root/{a}/{b}/{c}", "/root/aa/bb/cc/xyz.html");
    map.forEach((k, v) -> System.out.println(k + "=" + v));
    

    输出

    Exception in thread "main" java.lang.IllegalStateException: Pattern "/root/{a}/{b}/{c}" is not a match for "/root/aa/bb/cc/xyz.html"
    	at org.springframework.util.AntPathMatcher.extractUriTemplateVariables(AntPathMatcher.java:517)
    	at com.example.springbootdemo.MainApplication.main(MainApplication.java:17)
    

isPattern(String str):判断str是否可以作为一个pattern匹配器

注:当str是一个不带任何通配符(如:?***{}等)的字符串,即:str是一个准确的字符串时。此方法返回false,该方法认为:既然pattern是一个不带通配符的明确字符串,那么你直接和要匹配的path进行相等比较即可

  • 示例一

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    boolean isPattern = antPathMatcher.isPattern("/aa/bb/cc/xyz.html");
    System.out.println(isPattern);
    

    输出

    false
    
  • 示例二

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    boolean isPattern = antPathMatcher.isPattern("/aa/*/cc/xyz.html");
    System.out.println(isPattern);
    

    输出

    true
    
    
  • 示例三

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    boolean isPattern = antPathMatcher.isPattern("/aa/**/xyz.html");
    System.out.println(isPattern);
    
    

    输出

    true
    
    
  • 示例四

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    boolean isPattern = antPathMatcher.isPattern("/aa/?/xyz.html");
    System.out.println(isPattern);
    
    

    输出

    true
    
    
  • 示例五

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    boolean isPattern = antPathMatcher.isPattern("/aa/{qwer}/xyz.html");
    System.out.println(isPattern);
    
    

    输出

    true
    
    

match(String pattern, String path):path是否完全匹配pattern

  • 示例一(示例统配符?

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    // 输出:true
    System.out.println(antPathMatcher.match("/jd/a?c", "/jd/abc"));
    // 输出:false
    System.out.println(antPathMatcher.match("/jd/a?c", "/jd/ac"));
    // 输出:false
    System.out.println(antPathMatcher.match("/jd/a?c", "/jd/axyzc"));
    
    
  • 示例二(示例统配符*

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    // 输出:true
    System.out.println(antPathMatcher.match("/jd/a*c", "/jd/ac"));
    // 输出:true
    System.out.println(antPathMatcher.match("/jd/a*c", "/jd/abc"));
    // 输出:true
    System.out.println(antPathMatcher.match("/jd/a*c", "/jd/axyzc"));
    // 输出:false
    System.out.println(antPathMatcher.match("/jd/a*c", "/jd/a"));
    // 输出:false
    System.out.println(antPathMatcher.match("/jd/a*c", "/jd/xc"));
    // 输出:false
    System.out.println(antPathMatcher.match("/jd/a*c", "/jk/ac"));
    
    
  • 示例三(示例统配符**

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    //true
    //false
    //false
    System.out.println(antPathMatcher.match("**", ""));
    System.out.println(antPathMatcher.match("**", "/"));
    System.out.println(antPathMatcher.match("**", ""));
    
    //false
    //true
    //true
    System.out.println(antPathMatcher.match("/**", ""));
    System.out.println(antPathMatcher.match("/**", "/"));
    System.out.println(antPathMatcher.match("/**", ""));
    
    //true
    //false
    //false
    System.out.println(antPathMatcher.match("**/", ""));
    System.out.println(antPathMatcher.match("**/", "/"));
    System.out.println(antPathMatcher.match("**/", ""));
    
    //false
    //true
    //true
    System.out.println(antPathMatcher.match("/**/", ""));
    System.out.println(antPathMatcher.match("/**/", "/"));
    System.out.println(antPathMatcher.match("/**/", ""));
    
    //true
    //true
    //true
    //true
    //false
    //false
    System.out.println(antPathMatcher.match("/**/abc.html", "/abc.html"));
    System.out.println(antPathMatcher.match("/**/abc.html", "//abc.html"));
    System.out.println(antPathMatcher.match("/**/abc.html", "/1/2/3/4/5/abc.html"));
    System.out.println(antPathMatcher.match("/**/abc.html", "/a/b/c//jd/ac/abc.html"));
    System.out.println(antPathMatcher.match("/**/abc.html", "/a/abc"));
    System.out.println(antPathMatcher.match("/**/abc.html", "/a/bc.html"));
    
    
  • 示例四(示例占位符{}

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    //true
    //false
    //false
    System.out.println(antPathMatcher.match("a/{b}/c", "a/b0/c"));
    System.out.println(antPathMatcher.match("a/{b}/c", "a/b1/b2/b3/c"));
    System.out.println(antPathMatcher.match("a/{b}", "a/b1/b2/b3/c"));
    
    

matchStart(String pattern, String path):pattern的前面一部分是否就能匹配上整个path

注:若path与pattern完全匹配,那么也算:pattern的前面一部分匹配上了整个path

注:可理解为,path是pattern的一个子集

  • 示例

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    //false
    //true
    //true
    System.out.println(antPathMatcher.matchStart("a/{b}", "a/b0/c"));
    System.out.println(antPathMatcher.matchStart("a/{b}/c", "a/b0/c"));
    System.out.println(antPathMatcher.matchStart("a/{b}/c/d", "a/b0/c"));
    
    //false
    //true
    //true
    System.out.println(antPathMatcher.matchStart("a/?", "a/b/c"));
    System.out.println(antPathMatcher.matchStart("a/?/c", "a/b/c"));
    System.out.println(antPathMatcher.matchStart("a/?/c/d", "a/b/c"));
    
    //false
    //true
    //true
    System.out.println(antPathMatcher.matchStart("a/*", "a/b0/c"));
    System.out.println(antPathMatcher.matchStart("a/*/c", "a/b0/c"));
    System.out.println(antPathMatcher.matchStart("a/*/c/d", "a/b0/c"));
    
    //true
    //true
    //true
    System.out.println(antPathMatcher.matchStart("a/**", "a/b0/c"));
    System.out.println(antPathMatcher.matchStart("a/**/c", "a/b0/c"));
    System.out.println(antPathMatcher.matchStart("a/**/c/d", "a/b0/c"));
    
    

^_^ 如有不当之处,欢迎指正
^_^ 本文已经被收录进《程序员成长笔记》 ,笔者JustryDeng

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:22:50  更:2022-03-22 20:25:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:28:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码