public static boolean isMatch(String str, String exp) {
        int strIndex = 0;
        int expIndex = 0;
        int starIndex = -1; //记录上一个 '*' 的位置
        while (strIndex < str.length()) {
            final char pkgChar = str.charAt(strIndex);
            final char expChar = expIndex < exp.length() ? exp.charAt(expIndex) : '\0';
            if (pkgChar == expChar) { //字符相等
                strIndex++;
                expIndex++;
            } else if (expChar == '*') { //遇到'*', 记录'*'的位置，并记录 expIndex 和 match
                starIndex = expIndex;
                expIndex++;
            } else if (starIndex != -1) { //不是上述两种情况，无法匹配，因此回溯
                expIndex = starIndex + 1;
                strIndex++;
            } else { //其他情况， 直接返回false
                return false;
            }
        }

        //检测 exp 尾部是否全部都为 '*'
        while (expIndex < exp.length() && exp.charAt(expIndex) == '*') {
            expIndex++;
        }

        //若 exp 尾部全部为 '*'，说明匹配
        return expIndex == exp.length();
    }
@Test
    public void testIsMatch() {
        Assert.assertTrue(isMatch("cn.myperf4j.config.abc", "cn.myperf4j*abc"));
        Assert.assertTrue(isMatch("cn.myperf4j.config.abc", "*.myperf4j*abc"));
        Assert.assertTrue(isMatch("cn.myperf4j.config.abc", "*.myperf4j*a*c"));

        Assert.assertFalse(isMatch("cn.myperf4j.config.abc", "*.myperf4j*ac"));
        Assert.assertFalse(isMatch("cn.myperf4j.config.abc", "a*.myperf4j*ac"));
        Assert.assertFalse(isMatch("cn.myperf4j.config.abc", "a*.myperf4j.a*"));
    }