Java regex的问题

6yjfywim  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(157)

我想从字符串中提取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();
        }
3pmvbmvn

3pmvbmvn1#

我在评论中提出了以下建议,但现在让我解释一下:
[\w.]+\.pdf(?![\w.])

  1. [\w.]是一个“字符类”,这意味着它匹配[]中的任何字符。您还可以在两个字符之间使用“-”字符指定字符范围。例如,[A-Za-z0-9_]匹配范围'A'到'Z'、'a'到'z'和'0'到'9'中的任何字符以及下划线字符'_'。这些字符被认为是regex“word”字符,它有一个方便的缩写\w。因此,[\w.],它包含“.”字符(在字符类中,句点字符“.”并不意味着“匹配任何字符”;正好和句号吻合所以[\w.]等价于[A-Za-z0-9_.]
  2. [\w.]+匹配我在1中描述的 * 一个或多个 * 字符。
  3. \.pdf按字面意义匹配'. pdf'。
  4. (?![\w.])是一个 * 负前瞻Assert *。它不匹配任何字符,但Assert先前的匹配项后面没有任何单词字符或“.”。这是因为我们不想匹配'testfile_fake.pdf.tmp'。
    See regex demo
    这里是一个完整的Java demo的链接
7lrncoxx

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

1mrurvl1

1mrurvl13#

String str = "file_record_transcript.pdf,file_07241999.pdf,testfile_fake.pdf.tmp,file_record_transcript.pdf";
        String capturePattern = "^.+pdf$";
        String tokens[] = str.split(",");
        List<String> output = new ArrayList<>();
        Pattern p1 = Pattern.compile(capturePattern);
        Matcher m1;
        for (int i = 0; i < tokens.length; i++) {
            m1 = p1.matcher(tokens[i]);
            if (m1.find()) {
                System.out.println(tokens[i]);
                output.add(tokens[i]);
            }
        }
        System.out.println(String.join(",", output));

将给定的字符串拆分为标记,然后对每个标记执行正则表达式比较。最后,用分隔符(,)连接过滤后的标记。

相关问题