我有完整的文件路径,我只需要提取文件名和扩展名。所以我的输出将是fileName.csv。
例如:完整路径是: /Dir1/Dir2/Dir3/Dir4/Dir5/Dir6/fileName_20150108_002_20150109013841.csv 我的Regex输出应该是fileName.csv。
目录的扩展和级别不固定。
作为我的要求的一部分,我需要单个正则表达式,它可以提取fileName.csv而不是fileName_20150108_002_20150109013841.csv.how我能用单个正则表达式吗?
答案 0 :(得分:0)
以下可能适用于你
[^\\/:*?"<>|\r\n]+$
这个正则表达式已经在这两个例子上进行了测试:
\变种\ WWW \ www.example.com \的index.jsp \ index.jsp的
或者更确切地说,您应该使用File.getName()
来获得更好的方法。
String filename = new File("Payload/brownie.app/Info.plist").getName();
System.out.println(filename)
另一种方式是
int index = path.lastIndexOf(File.separatorChar);
String filename = path.substring(index+1);
最终在代码段
下方获取完整文件名后String str = filename;// in your case filename will be fileName_20150108_002_20150109013841.csv
str = str.substring(0,str.indexOf('_'))+str.substring(str.lastIndexOf('.'));
System.out.println("filename is ::"+str); // output will be fileName.csv
答案 1 :(得分:0)
不使用正则表达式,这可以解决为 -
public static String getFileName(String args){
args = args.substring(args.lastIndexOf('/')+1);
return args.substring(0,args.indexOf('_')) + args.substring(args.indexOf('.'));
}
答案 2 :(得分:0)
在下面的代码中,第一组将是fileName_timestamp.extension。我用空字符串替换了数字和下划线。这可能看起来很难看,但仍然会服务于你的目的。如果文件名包含数字,我们需要采用不同的方法。
public static void main(String[] args) {
String toBeSplitted = "/Dir1/Dir2/Dir3/Dir4/Dir5/Dir6/fileName_20150108_002_20150109013841.csv";
Pattern r = Pattern.compile("(/[a-zA-Z0-9_.-]+)+/?");
Matcher m = r.matcher(toBeSplitted);
if(m.matches()){
String s = m.group(1).replaceAll("(/|[0-9]|_)", "");
System.out.println(s);
}
}