如何实现带通配符的路径字符串匹配?
实现带通配符的路径匹配(Java)
你原来的代码用contains方法行不通,因为contains会把*当成普通字符去匹配,而实际路径里根本没有*,自然匹配不到。下面给你几种可行的实现方式:
方法一:使用正则表达式
把通配符*转换成正则里的[^/]+(匹配除斜杠外的任意字符,避免跨目录匹配),用Pattern和Matcher完成匹配:
private static void matchValue(String value) { // 将通配符*替换为正则表达式,确保只匹配单个目录 String regexPattern = "/user/[^/]+/box/"; // 启用忽略大小写模式 Pattern pattern = Pattern.compile(regexPattern, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(value); if (matcher.find()) { System.out.println(value); System.out.println("Match Found"); } }
方法二:用Spring的AntPathMatcher(适合Spring项目)
如果是Spring项目,直接用框架自带的AntPathMatcher,它原生支持Ant风格的通配符(*匹配单个路径段,**匹配多级目录):
import org.springframework.util.AntPathMatcher; private static void matchValue(String value) { AntPathMatcher pathMatcher = new AntPathMatcher(); String rule = "/user/*/box/"; // 忽略大小写的话,统一转成小写再匹配 boolean isMatched = pathMatcher.match(rule.toLowerCase(), value.toLowerCase()); if (isMatched) { System.out.println(value); System.out.println("Match Found"); } }
方法三:手动实现简单匹配逻辑
不想用正则或额外依赖的话,可以自己分割路径段逐个对比:
private static void matchValue(String value) { String rule = "/user/*/box/"; // 按斜杠分割路径和规则,处理首尾斜杠带来的空字符串 String[] valueParts = value.toLowerCase().split("/"); String[] ruleParts = rule.toLowerCase().split("/"); // 路径段数量不一致直接不匹配 if (valueParts.length != ruleParts.length) { return; } boolean matchSuccess = true; for (int i = 0; i < ruleParts.length; i++) { String rulePart = ruleParts[i]; String valuePart = valueParts[i]; // 遇到*就跳过匹配,否则必须完全相等 if (!"*".equals(rulePart) && !rulePart.equals(valuePart)) { matchSuccess = false; break; } } if (matchSuccess) { System.out.println(value); System.out.println("Match Found"); } }
内容的提问来源于stack exchange,提问作者Santosh_17
相关产品推荐
相关产品推荐

