Java正则分组排除下划线实现Excel文件名匹配分组需求
Java正则表达式提取Excel文件名分组(排除下划线)
你现在需要从table_A_Apr_2000.xlsx这类格式的Excel文件名里,用正则分组得到[table_A, Apr, 2000, .xlsx],还要排除中间的下划线对吧?你的现有正则用了分支匹配,没法精准捕获你要的四个分组,我来给你调整一下:
核心思路
我们要精准匹配文件名的固定结构:固定前缀_月份_年份.后缀,把每个目标部分设为单独的捕获组,同时跳过作为分隔符的下划线。
正确的正则表达式
Pattern p = Pattern.compile("^(" + table + ")_([A-Za-z]+)_([0-9]+)(\\.[a-zA-Z0-9]+)$");
各部分含义:
^(" + table + "):捕获第一组,也就是你定义的固定前缀table_A,^确保从字符串开头匹配_:匹配分隔用的下划线,但不将其放入捕获组([A-Za-z]+):第二组,捕获月份(比如Apr),匹配任意大小写字母_:再次匹配分隔下划线,不捕获([0-9]+):第三组,捕获年份(比如2000),匹配数字(\\.[a-zA-Z0-9]+)$:第四组,捕获文件后缀(比如.xlsx),$确保匹配到字符串结尾,转义的.匹配真实的点号
完整Java代码示例
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FilenameParser { public static void main(String[] args) { String table = "table_A"; String[] slist = {"table_A_Apr_2001.xlsx", "table_A_Jan_2023.xlsx"}; // 构造符合需求的正则表达式 Pattern p = Pattern.compile("^(" + table + ")_([A-Za-z]+)_([0-9]+)(\\.[a-zA-Z0-9]+)$"); for (String fileName : slist) { Matcher m = p.matcher(fileName); List<String> result = new ArrayList<>(); if (m.find()) { // 依次取出四个捕获组的内容 result.add(m.group(1)); result.add(m.group(2)); result.add(m.group(3)); result.add(m.group(4)); System.out.println("提取结果:" + result); } else { System.out.println("文件名格式不匹配:" + fileName); } } } }
运行这段代码,就能得到你想要的分组结果:[table_A, Apr, 2001, .xlsx]。
为什么原正则无法满足需求?
你之前的正则^"+table+"|\\d+|\\D+|[^_]*用了分支运算符|,这意味着正则会尝试匹配任意一个分支,而不是按顺序捕获完整的文件名结构。比如它可能先匹配table_A,再单独匹配Apr,接着匹配2001,最后匹配.xlsx,过程中可能捕获到多余内容,还无法保证严格符合文件名的格式规则,很容易出现匹配错误。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

