您好,登录后才能下订单哦!
通配符匹配是一种常见的字符串匹配问题,通常用于处理文件名匹配、搜索过滤等场景。在Java中,我们可以通过多种方式实现通配符匹配,本文将详细介绍几种常见的实现方法。
通配符匹配通常涉及两种通配符:
*:匹配任意长度的任意字符(包括空字符)。?:匹配任意单个字符。例如,模式 *.txt 可以匹配所有以 .txt 结尾的文件名,而模式 a?b 可以匹配 aab、acb 等字符串。
Java中的正则表达式(java.util.regex)可以用于实现通配符匹配。我们可以将通配符模式转换为正则表达式,然后使用 Pattern 和 Matcher 类进行匹配。
首先,我们需要将通配符模式转换为正则表达式。具体步骤如下:
* 替换为 .*。? 替换为 .。例如,通配符模式 *.txt 可以转换为正则表达式 .*\.txt。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class WildcardMatcher {
    public static boolean matches(String pattern, String input) {
        // 将通配符模式转换为正则表达式
        String regex = pattern.replace(".", "\\.")  // 转义点号
                             .replace("?", ".")    // 替换问号
                             .replace("*", ".*");  // 替换星号
        // 编译正则表达式
        Pattern compiledPattern = Pattern.compile(regex);
        // 创建匹配器
        Matcher matcher = compiledPattern.matcher(input);
        // 进行匹配
        return matcher.matches();
    }
    public static void main(String[] args) {
        String pattern = "*.txt";
        String input = "example.txt";
        boolean result = matches(pattern, input);
        System.out.println("匹配结果: " + result);  // 输出: 匹配结果: true
    }
}
动态规划是一种解决复杂问题的有效方法,适用于通配符匹配问题。我们可以使用一个二维数组 dp[i][j] 来表示模式的前 i 个字符和输入字符串的前 j 个字符是否匹配。
dp[0][0] 为 true,表示空模式匹配空字符串。dp[i][0] 为 true,如果模式的前 i 个字符都是 *。pattern[i-1] 和 input[j-1]:
pattern[i-1] 是 *,则 dp[i][j] = dp[i-1][j] || dp[i][j-1]。pattern[i-1] 是 ? 或 pattern[i-1] == input[j-1],则 dp[i][j] = dp[i-1][j-1]。dp[i][j] = false。public class WildcardMatcher {
    public static boolean isMatch(String pattern, String input) {
        int m = pattern.length();
        int n = input.length();
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        // 初始化第一行
        for (int i = 1; i <= m; i++) {
            if (pattern.charAt(i - 1) == '*') {
                dp[i][0] = dp[i - 1][0];
            }
        }
        // 填充dp数组
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (pattern.charAt(i - 1) == '*') {
                    dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
                } else if (pattern.charAt(i - 1) == '?' || pattern.charAt(i - 1) == input.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = false;
                }
            }
        }
        return dp[m][n];
    }
    public static void main(String[] args) {
        String pattern = "*.txt";
        String input = "example.txt";
        boolean result = isMatch(pattern, input);
        System.out.println("匹配结果: " + result);  // 输出: 匹配结果: true
    }
}
递归是一种直观的实现方法,适用于简单的通配符匹配问题。我们可以通过递归的方式逐个字符进行匹配。
*,则递归匹配剩余的模式和输入字符串,或者匹配剩余的模式和输入字符串的下一个字符。? 或与输入字符串当前字符相等,则递归匹配剩余的模式和输入字符串。false。public class WildcardMatcher {
    public static boolean isMatch(String pattern, String input) {
        return isMatchHelper(pattern, input, 0, 0);
    }
    private static boolean isMatchHelper(String pattern, String input, int pIndex, int sIndex) {
        if (pIndex == pattern.length()) {
            return sIndex == input.length();
        }
        if (pattern.charAt(pIndex) == '*') {
            return isMatchHelper(pattern, input, pIndex + 1, sIndex) ||
                   (sIndex < input.length() && isMatchHelper(pattern, input, pIndex, sIndex + 1));
        } else if (sIndex < input.length() && (pattern.charAt(pIndex) == '?' || pattern.charAt(pIndex) == input.charAt(sIndex))) {
            return isMatchHelper(pattern, input, pIndex + 1, sIndex + 1);
        } else {
            return false;
        }
    }
    public static void main(String[] args) {
        String pattern = "*.txt";
        String input = "example.txt";
        boolean result = isMatch(pattern, input);
        System.out.println("匹配结果: " + result);  // 输出: 匹配结果: true
    }
}
在Java中,我们可以通过多种方式实现通配符匹配。正则表达式适用于简单的场景,动态规划适用于复杂的模式匹配,而递归则适用于简单的实现。根据实际需求选择合适的实现方法,可以提高代码的效率和可维护性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。