[Java][工具方法]利用正则实现通配符(?/*)比较字符串

2021-04-22 111点热度 0人点赞 0条评论

开发是否遇到需要比较字符串是否符合通配符的规则的需求,例如,判断字符串hello.world 是否符合hello.* (*代表若干个字符串)或者是否符合hello.?????(多少个问号就代表多少个字符)

我们利用正则表达式可以很容易的写出,为了便于复用,将类似需求整理成工具方法,方便调用,代码如下(示例写在main方法里了):

import java.util.Arrays;
import java.util.regex.Pattern;

/**
 * @author Terry E-mail: yaoxinghuo at 126 dot com
 * @date 2021-4-22 10:41
 * @description
 */
public class WildcardMatch {

    public static void main(String[] args) throws Exception {
        //测试
        System.out.println(wildcardMatch("hello.????", "hello.world"));//false,不符合,因为world有5个字符,判断的规则是.后面只能4个字符
        System.out.println(wildcardMatch("hello.?????", "hello.world"));//true,符合
        System.out.println(wildcardMatch("hello.*", "hello.world"));//true,符合,.后面可以有任意个字符
    }

    private static final String PATTERN_LINE_START = "^";
    private static final String PATTERN_LINE_END = "$";
    private static final char[] META_CHARACTERS = {'$', '^', '[', ']', '(', ')', '{', '}', '|', '+', '.', '\\'};

    /**
     *
     * @param pattern 用?代表一个字符,*代表若干个字符
     * @param str 需要对比是否符合的源字符串
     * @return true表示匹配 false不匹配
     */
    public static boolean wildcardMatch(String pattern, String str) {
        pattern = convertToRegexPattern(pattern);
        return Pattern.matches(pattern, str);
    }

    //生成正则表达式
    private static String convertToRegexPattern(String wildcardString) {
        String result = PATTERN_LINE_START;
        char[] chars = wildcardString.toCharArray();
        for (char ch : chars) {
            if (Arrays.binarySearch(META_CHARACTERS, ch) >= 0) {
                result += "\\" + ch;
                continue;
            }
            switch (ch) {
                case '*':
                    result += ".*";
                    break;
                case '?':
                    result += ".{0,1}";
                    break;
                default:
                    result += ch;
            }
        }
        result += PATTERN_LINE_END;
        return result;
    }
}

 

admin

这个人很懒,什么都没留下

文章评论

*

code