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
相关产品推荐
相关产品推荐

