正则表达式文件名模式匹配

时间:2013-01-18 19:17:38

标签: java regex

我正在使用以下正则表达式:

Pattern p = Pattern.compile("(.*?)(\\d+)?(\\..*)?");

while(new File(fileName).exists())
{
    Matcher m = p.matcher(fileName);
    if(m.matches()) { //group 1 is the prefix, group 2 is the number, group 3 is the suffix
        fileName = m.group(1) + (m.group(2) == null ? "_copy" + 1 : (Integer.parseInt(m.group(2)) + 1)) + (m.group(3)==null ? "" : m.group(3));
    }
}

这适用于filename abc.txt,但如果有任何名称为abc1.txt的文件,则上述方法会提供abc2.txt。如何制作正则表达式条件或更改(m.group(2) == null ? "_copy" + 1 : (Integer.parseInt(m.group(2)) + 1)),以便它将abc1_copy1.txt作为新文件名返回,而不是abc2.txt,如abc1_copy2等等。

2 个答案:

答案 0 :(得分:0)

我不是一个java人,但一般来说,你应该使用库函数/类来解析文件名,因为许多平台都有不同的规则。

看看: http://people.apache.org/~jochen/commons-io/site/apidocs/org/apache/commons/io/FilenameUtils.html#getBaseName(java.lang.String

答案 1 :(得分:0)

Pattern p = Pattern.compile("(.*?)(_copy(\\d+))?(\\..*)?");

while(new File(fileName).exists())
{
    Matcher m = p.matcher(fileName);
    if (m.matches()) {
        String prefix = m.group(1);
        String numberMatch = m.group(3);
        String suffix = m.group(4);
        int copyNumber = numberMatch == null ? 1 : Integer.parseInt(numberMatch) + 1;

        fileName = prefix;
        fileName += "_copy" + copyNumber;
        fileName += (suffix == null ? "" : suffix);
    }
}