java 高效率 通配符字符串验证 函数

刚写的 经过简单测试 不知道是否完善, 分享一下 也许用的到 欢迎大家填坑

public static void main(String[] args) {
       /* System.out.println(getBeanNameByTableName("tab_name"));
        System.out.println(getBeanNameByTableName("core_pr_coupon_user"));*/
        System.out.println(getUri("/a/test/a/".toCharArray(), "/a/test/*".toCharArray()));
        System.out.println(getUri("/b/test/a/".toCharArray(), "/a/test/*".toCharArray()));

        System.out.println(getUri("/a/test/a/".toCharArray(), "/*/test/*/".toCharArray()));
        System.out.println(getUri("/a/test/a".toCharArray(), "/*/test/*/".toCharArray()));

        System.out.println(getUri("/a/asdf/a".toCharArray(), "/a/*/a".toCharArray()));
    }

    /**
     * 通配符验证 strsc 是否包含 strc
     * @param strc
     * @param strsc 标准串
     * @return
     */
    public static boolean getUri(char[] strc, char[] strsc){
        int cl = strc.length;
        int scl = strsc.length;
        int cli = 0;
        int i = 0;
        boolean next = false; // 通配符查找模式
        boolean prOk = false; // 上一次匹配成功
        int ni = 0;
        for (; i < scl; i++) {
            char n = strsc[i];
            char bn = strc[cli];
            if (n == '*') {
                if (!prOk)
                    return false; // 说明 两星号之间的部分判断失败
                else if (i == scl -1)
                    return true;// 最后一位为 * 号 上一位相等 条件成立
                ni = i;
                next = true;
                prOk = false;
                continue; // 继续匹配
            }
            if (!(prOk = bn == n) && !next) { // 非匹配模式下 条件不成立
                return false;
            }
            if (next && !prOk) {
                i = ni; // 统配符模式匹配失败 标准串下标原地等待
            }
            if (++cli >= cl)
                return prOk && i + 1 == scl ; // 长度不匹配
        }
        return prOk && cli == cl;
    }
发布了17 篇原创文章 · 获赞 24 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_22956867/article/details/79791977