如何拆分名称文件以计算 java 中的系列?
how to Split name file to count series in java?
我有一个文件列表,格式如下:
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 中的文件名(仅 name_of_file)?
尝试以下操作:
int i=0;
while(!fullName.charAt(i).equals('.')&&!fullName.charAt(i).equals('0')){
i++;
}
String name=fullName.substring(0, i);
取从fullName
开头到.
或0
第一次出现的字符串。
编辑:
参考评论和大数大于1..
的情况,灵感来自于此answer:
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);
或者干脆把所有的名字都拿走。
这个 class 解决了 main:
中显示的所有示例的问题
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: 处理不带任何下划线的文件名。
我针对mmxx的评论修改了chsdk的解决方案:
int i=0;
while(i < fullName.length() && ".0123456789".indexOf(fullName.charAt(i)) == -1) {
i++;
}
String name=fullName.substring(0, i);
编辑:
已添加
i < fullName.length()
我在这种模式下解决了这个问题:
nameOfFile.split("\.")[0].replaceall("_[0-9]*","");
split("\.")[0] 删除“.csv”name_of_file_001.csv => name_of_file_001
.replaceall("_[0-9]*","") "remove, if there is, "_001" name_of_file_001 => name_of_file
结果只是文件名
我有一个文件列表,格式如下:
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 中的文件名(仅 name_of_file)?
尝试以下操作:
int i=0;
while(!fullName.charAt(i).equals('.')&&!fullName.charAt(i).equals('0')){
i++;
}
String name=fullName.substring(0, i);
取从fullName
开头到.
或0
第一次出现的字符串。
编辑:
参考评论和大数大于1..
的情况,灵感来自于此answer:
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);
或者干脆把所有的名字都拿走。
这个 class 解决了 main:
中显示的所有示例的问题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: 处理不带任何下划线的文件名。
我针对mmxx的评论修改了chsdk的解决方案:
int i=0;
while(i < fullName.length() && ".0123456789".indexOf(fullName.charAt(i)) == -1) {
i++;
}
String name=fullName.substring(0, i);
编辑: 已添加
i < fullName.length()
我在这种模式下解决了这个问题:
nameOfFile.split("\.")[0].replaceall("_[0-9]*","");
split("\.")[0] 删除“.csv”name_of_file_001.csv => name_of_file_001
.replaceall("_[0-9]*","") "remove, if there is, "_001" name_of_file_001 => name_of_file
结果只是文件名