我的下载文件夹中有一些带有特定字符串模式的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
这里如何匹配正则表达式中的最大整数?
感谢
答案 0 :(得分:2)
一个简单的策略可能是检查括号中的数字,以填充映射将为数字的某些有序映射 - > filename,最后得到与最大数字相关联的文件名。我不认为只用REGEX就可以了。
答案 1 :(得分: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);
请注意,我没有逃避()
中的\\((\\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
次。