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

时间:2015-05-16 08:42:26

标签: java regex

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

假设我想找到下一个整数来为Untitled文件添加后缀。

以下是现有文件名的示例:

  • Untitled1.java - >应该匹配
  • untitled2.java - >应匹配(不区分大小写)
  • MyFile.java - >不匹配(不包含Untitled#.java)
  • NotUntitled3.java - >不匹配(与Untitled#.java完全匹配)

在此示例中,以下函数应返回: 3

    public int getNextUntitledFileSuffix(String[] fileNames){
      int nextSuffix = 1;
      int maxSuffix = 1;
      for (int i = 0; i < fileNames.length; i++){
        //use regex to set nextSuffix
      }
      return nextSuffix;
    }

2 个答案:

答案 0 :(得分:0)

您可以使用此代码从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
}

Demo.

由于您可以在数字不适合int时抛出异常,因此可以使用throws NumberFormatException标记方法,并使用Integer.parseInt(digits)获取值。之后,您可以将数字与maxSuffix进行比较,maxSuffix是序列的运行最大值。你应该从零开始maxSuffix而不是一,因为你会在最后增加它。

为避免溢出,请在返回Integer.MAX_VALUE之前检查maxSuffix+1是否等于i

答案 1 :(得分:0)

我根据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;
}