如何在Java中将文件名拆分为计数系列?

3

i have a list of files in this form:

name_of_file_001.csv
name_of_file_002.csv    
name_of_file_123.csv
or
name_of_file.csv
second_name_of_file.csv

我不知道这个文件是否有001。
如何在Java中获取文件名(仅文件名)?


我现在确实没有时间写一份可行的答案,但你考虑过使用正则表达式吗?例如像[a-z]*(?=[0-9]{3})这样的东西。 - posdef
4个回答

2

请尝试以下方法:

int i=0;
while(!fullName.charAt(i).equals('.')&&!fullName.charAt(i).equals('0')){
  i++;
}
String name=fullName.substring(0, i);

fullName的开头到第一次出现.0的字符串。

编辑:

参考评论和大于1..的高数字的情况,受到这个答案的启发:

    int i=0;
    String patternStr = "[0-9\.]";
    Pattern pattern = Pattern.compile(patternStr);
    Matcher matcher = pattern.matcher(fullName);
    if(matcher.find()){
     i=matcher.start();  //this will give you the first index of the regex
    }
    String name=fullName.substring(0, i);

编辑2:

当没有扩展名并且全名不符合正则表达式(没有数字)的情况下:

if(matcher.find()){
     i=matcher.start();  //this will give you the first index of the regex
}else {
 i=fullname.length();
}
String name=fullName.substring(0, i);

或者我们将获取所有名称。

1
有可能编号很高(例如,name_of_file_142.csv)。 - Mauro Midolo
@mmxx 是的,说得好。那么在这种情况下,我们只需添加此测试 !fullName.charAt(i).equals('1') - cнŝdk
那么以2、3、4、5、6、7、8、9开头的数字呢? - fjf2002
没有扩展名的文件名怎么办? - Eldad Mor
是的,我知道这是一个有效的名称,在这种情况下,如果没有扩展名并且正则表达式没有匹配项,我们只需要将“i”变量设置为fullname的长度。 - cнŝdk
显示剩余3条评论

1

我根据mmxx的评论修改了chsdk的解决方案:

int i=0;
while(i < fullName.length() && ".0123456789".indexOf(fullName.charAt(i)) == -1) {
  i++;
}
String name=fullName.substring(0, i);

编辑:

EDIT: 添加了

i < fullName.length()

0

我用以下方式解决了这个问题:

nameOfFile.split("\\.")[0].replaceall("_[0-9]*","");

split("\.")[0] 去掉“.csv” name_of_file_001.csv => name_of_file_001

.replaceall("_[0-9]*","") 如果有的话,去掉“_001” name_of_file_001 => name_of_file

结果是仅文件名。


0
这个小类可以解决主函数中显示的所有示例问题:
public class Example {

   private static boolean isNaturalNumber(String str)
   {
     return str.matches("\\d+(\\.\\d+)?");
   }

   public static String getFileName(String s) {
        String fn = s.split("\\.")[0];
        int idx = fn.lastIndexOf('_');
        if (idx < 0) {
            return fn;
        }
        String lastPart = fn.substring(idx+1);
        System.out.println("last part = " + lastPart);
        if (isNaturalNumber(lastPart)) {
            return fn.substring(0,idx);
        } else {
            return fn;
        }
    }

    public static void main(String []args){
        System.out.println(getFileName("file_name_001.csv"));
        System.out.println(getFileName("file_name_1234.csv"));
        System.out.println(getFileName("file_name.csv"));
        System.out.println(getFileName("file_name"));
        System.out.println(getFileName("file"));
    }
}

编辑 1:用正则检查替换了基于异常的检查。

编辑 2:处理没有下划线的文件名。


在常规执行流程中依赖异常不是良好的编程实践。 - fjf2002
这取决于您需要调用此函数的次数。请参阅此处的替代方法:https://dev59.com/QXNA5IYBdhLWcg3wEZiT - Eldad Mor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接