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

Java正则表达式问题:无法从字符串提取正确PDF文件名

问题分析与解决方案

你当前的正则表达式^.+pdf$无法匹配目标内容,核心问题有两个:

  • ^和$是整个字符串的开头/结尾锚点,但你的目标字符串是多个逗号分隔的文件名组合,整体既不以.pdf结尾(最后是.pdf.tmp),也无法定位到单个文件名项
  • 没考虑逗号分隔的规则,无法拆分出独立的文件条目

正确的正则表达式

要匹配符合要求的PDF文件名,可使用:

(?:^|,)([^,]+?\.pdf)(?:,|$)

各部分含义:

  • (?:^|,):匹配字符串开头或逗号,定位单个文件名的起始位置(非捕获组,不提取该部分)
  • ([^,]+?\.pdf):捕获目标文件名——[^,]+?匹配任意非逗号字符(非贪婪模式,避免过度匹配),.pdf确保是PDF后缀
  • (?:,|$):匹配逗号或字符串结尾,确保.pdf是该文件名的最终后缀(非捕获组)

修正后的代码

String str = "file_record_transcript.pdf,file_07241999.pdf,testfile_fake.pdf.tmp";
String capturePattern = "(?:^|,)([^,]+?\\.pdf)(?:,|$)";

Pattern p1 = Pattern.compile(capturePattern);
Matcher m1 = p1.matcher(str);

while(m1.find()) {
    // 提取捕获组1的内容,即匹配到的PDF文件名
    String pdfFile = m1.group(1);
    System.out.println("匹配到的PDF文件: " + pdfFile);
    System.out.println("起始索引: " + m1.start(1));
    System.out.println("结束索引: " + m1.end(1));
    System.out.println();
}

输出结果

匹配到的PDF文件: file_record_transcript.pdf
起始索引: 0
结束索引: 27

匹配到的PDF文件: file_07241999.pdf
起始索引: 28
结束索引: 47

补充简化写法(适合学习理解)

如果不想用正则,也可以先按逗号拆分字符串,再逐个判断后缀:

String str = "file_record_transcript.pdf,file_07241999.pdf,testfile_fake.pdf.tmp";
String[] files = str.split(",");
for(String file : files) {
    // 只保留以.pdf结尾且后面无额外后缀的文件
    if(file.endsWith(".pdf") && !file.contains(".pdf.")) {
        System.out.println(file);
    }
}

内容的提问来源于stack exchange,提问作者Paras Mani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:52:40