0

我的下载文件夹中有一些带有特定字符串模式的 pdf 文件。我需要获取最新保存的文件。

我的代码是

public static void main(String args[])
    {
        String directory=System.getProperty("user.home")+"\\Downloads";
        File dir=new File(directory);
        for(File file:dir.listFiles())
        {
            if(file.getName().endsWith(".pdf"))
            {

                String res=file.getName();
                match(res);
                //System.out.println(file.getName());
            }
        }

    }

    private static void match(String res) {
String pattern="[a-zA-Z][0-9][0-9]CR[0-9][0-9][0-9][0-9]-[a-zA-Z][a-zA-Z][a-zA-Z]-[A-Z]-[0-9] \\(\\d+\\).pdf";
        Pattern r=Pattern.compile(pattern);
        Matcher m=r.matcher(res);
        if(m.find())
        {
            System.out.println("******* Match *********"+m.group());
        }
        else
        {

            System.out.println("******No match*******");
        }

}

我的输出是这样的

******* Match *********F90CR0010-HBR-C-4 (5).pdf
******* Match *********F90CR0010-HBR-C-4 (6).pdf
******* Match *********F90CR0010-HBR-C-4 (7).pdf

现在我需要找到大括号()内编号最大的文件。所以在这种情况下我需要

******* Match *********F90CR0010-HBR-C-4 (7).pdf

这里如何匹配正则表达式中的最大整数?

谢谢

4

2 回答 2

2

一个简单的策略可能是检索括号中的数字,填充一些排序映射,其中映射将是数字 -> 文件名,最后获得与最大数字关联的文件名。我认为仅使用 REGEX 是不可能的。

于 2013-06-06T09:39:30.550 回答
2

您可以将一个组添加到您的正则表达式中,并添加一个计数器来保留该数字:

int greater = 0;
String greaterFile = "";
String pattern="[a-zA-Z][0-9][0-9]CR[0-9][0-9][0-9][0-9]-[a-zA-Z][a-zA-Z][a-zA-Z]-[A-Z]-[0-9] \\((\\d+)\\).pdf";
                                                                                               //^^^^^^^^
Pattern r=Pattern.compile(pattern);
Matcher m=r.matcher("F90CR0010-HBR-C-4 (7).pdf");
if(m.find())
{
    System.out.println("******* Match *********"+m.group());
    int number = Integer.parseInt(m.group(1));
    if (number > greater)
    {
        greater = number;
        greaterFile = m.group();
    }
}
else
{
    System.out.println("******No match*******");
}
System.out.println("Greater number is " + greater + " for " + greaterFile);

请注意,我没有转义()in \\((\\d+)\\).pdf,这是因为它们在表达式中的功能,它们定义了一个组。

稍后我可以使用它的索引检索该组,知道该组0是整个匹配项,下一个组1, 是我们的编号。

这是一个文件,但您可以轻松地将其转换为您的上下文。

编辑您的正则表达式,它可以简化如下:

String pattern="[a-zA-Z]\\d{2}CR\\d{4}-[a-zA-Z]{3}-[A-Z]-\\d \\((\\d+)\\).pdf";

\\d表示一个数字,{n}表示前面的表达式n时间。

于 2013-06-06T09:40:56.540 回答