You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:03:09