开发是否遇到需要比较字符串是否符合通配符的规则的需求,例如,判断字符串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; } }
文章评论