java如何实现通配符匹配

发布时间:2022-01-17 14:31:45 作者:清风
来源:亿速云 阅读:683

Java如何实现通配符匹配

通配符匹配是一种常见的字符串匹配问题,通常用于处理文件名匹配、搜索过滤等场景。在Java中,我们可以通过多种方式实现通配符匹配,本文将详细介绍几种常见的实现方法。

1. 通配符匹配的基本概念

通配符匹配通常涉及两种通配符:

例如,模式 *.txt 可以匹配所有以 .txt 结尾的文件名,而模式 a?b 可以匹配 aabacb 等字符串。

2. 使用正则表达式实现通配符匹配

Java中的正则表达式(java.util.regex)可以用于实现通配符匹配。我们可以将通配符模式转换为正则表达式,然后使用 PatternMatcher 类进行匹配。

2.1 通配符模式转换为正则表达式

首先,我们需要将通配符模式转换为正则表达式。具体步骤如下:

例如,通配符模式 *.txt 可以转换为正则表达式 .*\.txt

2.2 实现代码

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
    }
}

2.3 优缺点

3. 使用动态规划实现通配符匹配

动态规划是一种解决复杂问题的有效方法,适用于通配符匹配问题。我们可以使用一个二维数组 dp[i][j] 来表示模式的前 i 个字符和输入字符串的前 j 个字符是否匹配。

3.1 动态规划算法

  1. 初始化 dp[0][0]true,表示空模式匹配空字符串。
  2. 初始化 dp[i][0]true,如果模式的前 i 个字符都是 *
  3. 对于每个字符 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

3.2 实现代码

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
    }
}

3.3 优缺点

4. 使用递归实现通配符匹配

递归是一种直观的实现方法,适用于简单的通配符匹配问题。我们可以通过递归的方式逐个字符进行匹配。

4.1 递归算法

  1. 如果模式为空,输入字符串也必须为空。
  2. 如果模式当前字符是 *,则递归匹配剩余的模式和输入字符串,或者匹配剩余的模式和输入字符串的下一个字符。
  3. 如果模式当前字符是 ? 或与输入字符串当前字符相等,则递归匹配剩余的模式和输入字符串。
  4. 否则,返回 false

4.2 实现代码

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
    }
}

4.3 优缺点

5. 总结

在Java中,我们可以通过多种方式实现通配符匹配。正则表达式适用于简单的场景,动态规划适用于复杂的模式匹配,而递归则适用于简单的实现。根据实际需求选择合适的实现方法,可以提高代码的效率和可维护性。

推荐阅读:
  1. oracle通配符过滤(模糊匹配)
  2. 字符串匹配之通配符问题-

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:java如何实现字符串相乘

下一篇:vue如何用Echarts画柱状图

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》