`

java实现路径通配符*,**,?

    博客分类:
  • java
 
阅读更多

* 表示匹配0或多个不是/的字符

** 表示匹配0或多个任意字符

? 表示匹配1个任意字符

/**
     * 将通配符表达式转化为正则表达式
     * @param path
     * @return
     */
    private static String getRegPath(String path) {
        char[] chars = path.toCharArray();
        int len = chars.length;
        StringBuilder sb = new StringBuilder();
        boolean preX = false;
        for(int i=0;i<len;i++){
            if (chars[i] == '*'){//遇到*字符
                if (preX){//如果是第二次遇到*,则将**替换成.*
                    sb.append(".*");
                    preX = false;
                }else if(i+1 == len){//如果是遇到单星,且单星是最后一个字符,则直接将*转成[^/]*
                    sb.append("[^/]*");
                }else{//否则单星后面还有字符,则不做任何动作,下一把再做动作
                    preX = true;
                    continue;
                }
            }else{//遇到非*字符
                if (preX){//如果上一把是*,则先把上一把的*对应的[^/]*添进来
                    sb.append("[^/]*");
                    preX = false;
                }
                if (chars[i] == '?'){//接着判断当前字符是不是?,是的话替换成.
                    sb.append('.');
                }else{//不是?的话,则就是普通字符,直接添进来
                    sb.append(chars[i]);
                }
            }
        }
        return sb.toString();
    }

 

 /**
     * 通配符模式
     * @param whitePath - 白名单地址
     * @param reqPath - 请求地址
     * @return
     */
    private static boolean wildcardEquals(String whitePath, String reqPath) {
        String regPath = getRegPath(whitePath);
        return Pattern.compile(regPath).matcher(reqPath).matches();
    }

 

public static void main(String[] args) {
        String[] whiteList = new String[]{
                "/abc/?df/ddd",  "/abc/df/dfd",  "/abc/***/dfd", "/abc/*", "/abd/**", "/g??gle", "/*.do","/ttt"
        };
        boolean r = FilterUtil.checkWhiteList("/abc/1/ss/dfd",whiteList);
        System.out.println(r);
    }

 

分享到:
评论

相关推荐

    Java 通过通配符查找文件 *.*, *.java, a*.*, a*.java

    Java 通过通配符查找文件 例如:*.*, *.java, a*.*, a*.java

    Java使用路径通配符加载Resource与profiles配置使用详解

    Java使用路径通配符加载Resource与profiles配置使用详解 本文主要介绍了Java使用路径通配符加载Resource与profiles配置使用详解。通过示例代码,详细介绍了Java使用路径通配符加载Resource与profiles配置的使用方法...

    java代码实现coap 协议请求 服务器端+客户端

    在本文中,我们将深入探讨如何使用Java来实现CoAP(Constrained Application Protocol)协议,这是一种专为物联网(IoT)设备设计的轻量级通信协议。CoAP与HTTP类似,但更加适合资源有限的设备。我们将关注服务器端...

    rabbitmq面试题.pdf

    - **主题交换器:** 支持通配符(# 和 *)来进行模式匹配,允许更灵活的消息分发方式。 - **使用方法:** 定义主题模式(如`stock.#`),并根据该模式将消息路由到相应的队列。 **11. RabbitMQ支持哪些高级消息模式...

    java学习路径三篇

    Java学习路径三篇 在Java编程领域,学习之路并非一蹴而就,它需要系统性的规划和持续的努力。本资源集合“新手必读”旨在为初学者提供一条清晰的学习路径,帮助他们逐步掌握Java的核心概念和技术。下面我们将深入...

    java基础知识点.pdf

    - **通配符**:`*`可以匹配任意文件名,`*.java`匹配所有.java扩展名的文件。 #### 四、Java命令 1. **javac**:Java编译器,用于将`.java`源文件编译成`.class`字节码文件。 2. **java**:Java解释器,用于运行`....

    《Java 基础入门(传智播客)》_高清中文版pdf 网盘链接

    - **泛型通配符**:通配符的定义、种类及其实例应用。 #### 9. Lambda表达式 - **Lambda表达式的概念**:Lambda表达式的定义、语法格式及其实现原理。 - **函数式接口**:函数式接口的定义及其与Lambda表达式的联系...

    java从入门到深入

    本课程“Java从入门到深入”旨在为初学者提供全面且系统的Java学习路径,适合对Java有浓厚兴趣并立志深入研究的爱好者。 1. **Java基础知识** - **环境配置**:首先,学习Java需要安装Java Development Kit (JDK)...

    Java基础试题

    - **通配符**:? 表示任意类型,? extends T 表示某种特定类型的子类型,? super T 表示某种特定类型的超类型。 #### 9. Lambda表达式 - **简介**:Java 8引入的新特性,简化了函数式接口的实现。 - **使用场景**:...

    Java面试所问到的问题

    - **通配符**:使用`?`表示未知类型。 **2.2 Lambda表达式** - **语法**:`(参数列表) -&gt; {表达式;}`。 - **应用场景**:简化函数式接口的实现,提高代码可读性和简洁性。 **2.3 Stream API** - **流的创建**:`...

    黑马程序员入学Java精华总结

    - 理解面向对象的概念和Java如何实现这些概念。 - 掌握基本语法,如变量、数据类型、控制结构等。 - 练习编写代码,理论结合实践。 8. **Java语法格式** - Java代码遵循严格的语法规则,如每个语句末尾必须以...

    使用路径表达式在 XML 文档中进行导航(xpath简介)

    3. **XPath 通配符**: - `*`:匹配任何元素节点。 - `@*`:匹配任何属性节点。 - `node()`:匹配任何类型的节点。 4. **选取多个路径**: - 使用 `|` 运算符合并多个路径表达式的节点集。 #### 五、XPath ...

    Java中高级核心知识全面解析(精华必看)

    Java泛型允许在定义类、接口和方法时指定类型参数,以实现类型安全和代码重用。类型擦除是指在编译期间,泛型信息会被删除,以保持与早期版本的Java兼容。常用的通配符包括&lt;?&gt;、extends T和super T。 **1.3 基本...

    JAVA经典教材笔记

    - **通配符** - 通配符的使用:?表示任意类型。 - 限定通配符:? extends T、? super T。 - **泛型的其他应用** - 泛型类与泛型方法:使用泛型增强类和方法的功能。 - 泛型擦除:编译后泛型信息会被擦除。 - **...

    Java核心知识点整理.rar

    - **通配符**:?,上限通配符&lt;? extends T&gt;,下限通配符&lt;? super T&gt;。 12. **枚举与注解**: - **枚举类型**:Java中的枚举可以包含方法和常量,常用于定义固定值。 - **注解**:元数据,用于提供编译器或运行时...

    java实现泛域名解析

    泛域名解析是指利用通配符 \* (星号)来做次级域名,以实现所有的次级域名均指向同一 IP 地址。例如支付宝的域名是 www.alipay.com,域名下面有帮助中心 help.alipay.com、abc.alipay.com 等等子站点。有实力的公司...

    JAVA学习计划和方法

    - **定义**: `CLASSPATH`环境变量用于指定Java虚拟机(JVM)加载类文件(class files)的路径。 - **作用**: JVM在运行时会根据`CLASSPATH`中指定的路径查找并加载所需的类文件。 - **示例**: `CLASSPATH ;C:/java/...

    黑马程序员入学Java知识

    - 线程是进程内的独立执行路径。 2. **创建线程方式** - 通过继承`Thread`类。 - 实现`Runnable`接口。 3. **两种进程创建方式比较** - 继承`Thread`类更简单。 - 实现`Runnable`接口更灵活。 4. **线程的...

Global site tag (gtag.js) - Google Analytics