Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何匹配正则表达式中的最大数字_Java_Regex_Integer - Fatal编程技术网

Java 如何匹配正则表达式中的最大数字

Java 如何匹配正则表达式中的最大数字,java,regex,integer,Java,Regex,Integer,我的下载文件夹中有一些带有特定字符串模式的pdf文件。我需要获取最新保存的文件 我的代码是 public static void main(String args[]) { String directory=System.getProperty("user.home")+"\\Downloads"; File dir=new File(directory); for(File file:dir.listFiles()) {

我的下载文件夹中有一些带有特定字符串模式的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
这里如何匹配正则表达式中的最大整数


感谢

一个简单的策略可能是检索括号中的数字,填充一些排序映射,映射为digit->filename,最后获取与最大数字关联的文件名。我认为简单地使用正则表达式是不可能的。

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

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

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);
请注意,我没有在
\\(\\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
次。

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

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);
请注意,我没有在
\\(\\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
次。

Regex不适用于此类问题。只需在代码中执行即可。@AlexanderPavlov那么我可以对其进行排序吗?您不能只检查文件的上次写入时间或创建时间吗?@ThaMe90可以通过代码进行检查吗?检查正则表达式不适用于此类问题。只需要用代码就可以了。@AlexanderPavlov那么我可以对它进行排序吗?你不能只检查文件的最后写入时间或创建时间吗?@ThaMe90可以通过代码检查吗?检查你能详细说明你的答案吗?我对regexIt真的很陌生你能详细说明你的答案吗?我对regexIt真的很陌生,它在线程“main”中抛出
异常java.lang.IndexOutOfBoundsException:No group 1
如果允许修改,我还简化了您的正则表达式。仅为了找出哪个文件比另一个文件旧或新,这不是太复杂了吗?在某些情况下,正则表达式在处理文档中的文本以查找文档的特定部分时是非常强大的工具文本。当然,您也可以使用它们来检查文件名,但是由于某些文件名(例如您的文件名)的复杂性,所需的正则表达式将变得极其复杂(而且不必要)。有更好的办法当然,但是我承认我并没有试图理解问题本身,但是如果这个代码是用于hat目的的,那么它肯定不是更好的方法。它在线程“main”中抛出
异常java.lang.IndexOutOfBoundsException:No group 1
如果允许修改,我还简化了您的正则表达式。仅为了找出哪个文件比另一个文件旧或新,这不是太复杂了吗?在某些情况下,正则表达式在处理文档中的文本以查找文档的特定部分时是非常强大的工具文本。当然,您也可以使用它们来检查文件名,但是由于某些文件名(例如您的文件名)的复杂性,所需的正则表达式将变得极其复杂(而且不必要)。有更好的办法当然,但是我承认我并没有试图去理解问题本身,但是是的,如果这个代码是为了帽子的目的而需要的话,它肯定不是更好的方法。