我想从字符串中提取PDF文件的名称,但没有显示任何内容。
- string =“file_record_transcript.pdf,file_07241999.pdf,testfile_fake. pdf. tmp”
- 所需输出:file_record_transcript.pdf,file_07241999.pdf
这是一个学习的例子,我想找到匹配pdf文件(扩展名为.pdf)的模式,并忽略其他扩展名,如. pdf.tmp。
我的方法:使用regex ^.+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()) {
System.out.println(m1.group());
System.out.println("starts at index : "+m1.start());
System.out.println("ends at index : "+m1.end());
System.out.println();
}
3条答案
按热度按时间3pmvbmvn1#
我在评论中提出了以下建议,但现在让我解释一下:
[\w.]+\.pdf(?![\w.])
[\w.]
是一个“字符类”,这意味着它匹配[]
中的任何字符。您还可以在两个字符之间使用“-”字符指定字符范围。例如,[A-Za-z0-9_]
匹配范围'A'到'Z'、'a'到'z'和'0'到'9'中的任何字符以及下划线字符'_'。这些字符被认为是regex“word”字符,它有一个方便的缩写\w
。因此,[\w.]
,它包含“.”字符(在字符类中,句点字符“.”并不意味着“匹配任何字符”;正好和句号吻合所以[\w.]
等价于[A-Za-z0-9_.]
。[\w.]+
匹配我在1中描述的 * 一个或多个 * 字符。\.pdf
按字面意义匹配'. pdf'。(?![\w.])
是一个 * 负前瞻Assert *。它不匹配任何字符,但Assert先前的匹配项后面没有任何单词字符或“.”。这是因为我们不想匹配'testfile_fake.pdf.tmp'。See regex demo
这里是一个完整的Java demo的链接
7lrncoxx2#
初始正则表达式试图匹配以
pdf
结尾的整个字符串,而不是匹配pdf
的字符串中的匹配项。(.+?\.pdf),
看起来不错,但不是完美的https://regex101.com/r/L1voXA/1。你会想用不同的输入来测试它,就像这个https://regex101.com/r/ug4E3w/2,并根据需要进行调整。比赛:
file_record_transcript.pdf
file_07241999.pdf
不匹配:
testfile_fake.pdf.tmp
下面是一个完整的Java demo
1mrurvl13#
将给定的字符串拆分为标记,然后对每个标记执行正则表达式比较。最后,用分隔符(,)连接过滤后的标记。