java实现字符串匹配(?代表一个字符,*代表0到多个字符)

5 篇文章 0 订阅

题目:实现路由转发模块,根据功能号进行匹配,匹配原理是根据实际请求的功能号是否与预先配置的转发规则匹配,转发规则支持?和*,例如转发规则600???,实际请求功能号是600570则通过,不可调用已有的实现函数,实际过程中,功能号只会是0-9或者a-z(大小写敏感),预定义的模式匹配串只包含0-9,a-z,?,*

参考以下博客

java 配对_Java实现通配符匹配_weixin_39588432的博客-CSDN博客

原理:s为带匹配的字符串,p是匹配规则,将s和p的字段一个个取出来比较是不是一样,匹配规则取到?的时候可以匹配字符串的任意字符,匹配规则取到*的时候记录下当前位置,然后匹配规则后跳1位匹配,失败的话回溯并将带匹配的字符串后跳1位(意思就是遇到*号,先当成不匹配字符看看可不可以,不行的话就当做匹配1个,再不行就匹配2个...),一直到匹配的字符串匹配完,如果匹配规则还没有结束,就要看匹配规则剩余的字符串是不是全是*号,全是的话匹配成功,否则匹配失败

    /**
     *
     * @param s 待匹配的字符串
     * @param p 匹配规则
     * @return
     */
    public static Boolean isMatch(String s,String p){
        //s的索引位置
        int i=0;
        //p的索引位置
        int j=0;
        //通配符时回溯的位置
        int ii=-1;
        int jj=-1;
        while(i<s.length()){
            if(j<p.length()&&p.charAt(j)=='*'){
                //遇到通配符了,记录下位置,规则字符串+1,定位到非通配字符串
                ii=i;
                jj=j;
                j++;
            }else if(j<p.length()&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='?')){
                //匹配到了
                i++;
                j++;
            }else{
                //匹配失败,需要判断s 是否被p的*号匹配着
                if(jj==-1){//前面没有通配符
                    return false;
                }
                //回到之前记录通配符的位置
                j=jj;
                //带匹配字符串也回到记录的位置,并后移一位
                i=ii+1;
            }

        }
        //当s的每一个字段都匹配成功以后,判断p剩下的串,是*则放行
        while(j<p.length()&&p.charAt(j)=='*'){
            j++;
        }
        //检测到最后就匹配成功
        return j==p.length();

    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值