Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 - Fatal编程技术网

Java 使用正则表达式查找两个文字字符串之间的最大数字

Java 使用正则表达式查找两个文字字符串之间的最大数字,java,regex,Java,Regex,使用正则表达式获取与特定模式匹配的字符串组中的最大数的最佳方法是什么。 例如: 假设我想找到下一个整数作为一个无标题文件的后缀 以下是已存在文件名的示例: Untitled1.java->应匹配 untitled2.java->应匹配不区分大小写 MyFile.java->should not match不包含Untitled.java NotUntitled3.java->should not match与Untitled.java不完全匹配 在本例中,下面的函数应返回:3 您可以使用以下代码

使用正则表达式获取与特定模式匹配的字符串组中的最大数的最佳方法是什么。 例如:

假设我想找到下一个整数作为一个无标题文件的后缀

以下是已存在文件名的示例:

Untitled1.java->应匹配 untitled2.java->应匹配不区分大小写 MyFile.java->should not match不包含Untitled.java NotUntitled3.java->should not match与Untitled.java不完全匹配 在本例中,下面的函数应返回:3


您可以使用以下代码从untitledNNN.java文件名中提取数字部分:

Pattern p = Pattern.compile("^untitled(\\d+)[.]java$", Pattern.CASE_INSENSITIVE);
for (String fileName : fileNames) {
    Matcher m = p.matcher(fileName);
    if (!m.find()) {
        continue;
    }
    String digits = m.group(1);
    ... // Parse and find the max
}
由于可以在数字不适合int时引发异常,因此可以使用throws NumberFormatException标记方法,并使用Integer.parseIntdigits获取值。之后,您可以将数字与maxSuffix(序列的运行最大值)进行比较。maxSuffix应该从零开始,而不是从一开始,因为它将在末尾递增


为了避免溢出,请在返回maxSuffix+1之前检查maxSuffix是否等于Integer.MAX_值。

我根据dasblinkenlight的答案添加了其余逻辑:

public int getNextUntitledFileSuffix(List<String> fileNames) throws NumberFormatException
{
    int maxSuffix = 0;
    final Pattern pattern = Pattern.compile("^untitled(\\d+)[.]java$", Pattern.CASE_INSENSITIVE);
    for (String fileName : fileNames)
    {
        Matcher matcher = pattern.matcher(fileName);
        if (matcher.find())
        {
            int suffix = Integer.parseInt(matcher.group(1));
            if (suffix > maxSuffix)
            {
                maxSuffix = suffix;
            }
        }
    }
    return maxSuffix + 1;
}

我不确定要使用哪个正则表达式函数来匹配、替换等,但对于我尝试过的正则表达式,^/Untitled[0-9]。java/我认为这说明了这个字符串的开头,但它没有说明多位数或不区分大小写。你读过正则表达式的文档吗?文档是,Oracle教程是。请注意,在Java中,您没有将正则表达式放在//中。如果有untitled1.Java、untitled2.Java和untitled4.Java,该怎么办?你希望是3还是5?如果是那样的话,我希望是5Hey@dasblinkenlight,我得到了carot和美元符号。转义的d+必须表示任何数字,但为什么它是双转义的并用括号包装?还有,为什么句号被括在括号中?@cosbor11 double-escape用于Java编译器:它将两个斜杠转换为一个斜杠,这是正则表达式引擎所需要的。括号用于标记捕获组,以便您可以通过调用m.group1来检索它。括号中的句号表示一个点。没有括号,表示任何单个字符。现在有意义了。非常感谢你的帮助。你是个巫师!
public int getNextUntitledFileSuffix(List<String> fileNames) throws NumberFormatException
{
    int maxSuffix = 0;
    final Pattern pattern = Pattern.compile("^untitled(\\d+)[.]java$", Pattern.CASE_INSENSITIVE);
    for (String fileName : fileNames)
    {
        Matcher matcher = pattern.matcher(fileName);
        if (matcher.find())
        {
            int suffix = Integer.parseInt(matcher.group(1));
            if (suffix > maxSuffix)
            {
                maxSuffix = suffix;
            }
        }
    }
    return maxSuffix + 1;
}