我想从路径中删除所有目录名:
Payload/brownie.app/Info.plist
应该成为
Info.plist
我应该使用什么正则表达式,还是可以在java中使用String中的replace()? 谢谢!
答案 0 :(得分:19)
试试这个:
new File("Payload/brownie.app/Info.plist").getName()
返回没有目录的文件名。
示例:
String filename = new File("Payload/brownie.app/Info.plist").getName();
System.out.println(filename);
Outupt:
Info.plist
答案 1 :(得分:11)
您不需要正则表达式。只需找到最后一个斜杠并使用子字符串:
int index = path.lastIndexOf(File.separatorChar);
String name = path.substring(index+1);
或使用:
new File(path).getName();
答案 2 :(得分:8)
这涵盖所有光谱目录,尾随或起始斜杠。
到目前为止,所有其他人都没有......
public static String extractFilename(String path) {
java.util.regex.Pattern p = java.util.regex.Pattern.compile('^[/\\\\]?(?:.+[/\\\\]+?)?(.+?)[/\\\\]?$');
java.util.regex.Matcher matcher = p.matcher(path);
if ( matcher.find() ) {
return matcher.group(1);
}
return null;
}
println extractFilename("data\\\\path/to/file/RandomFile.pdf")
println extractFilename("RandomFile.pdf")
println extractFilename("RandomFile.pdf/")
println extractFilename("data\\\\path/to/file/RandomFile.pdf/")
println extractFilename("/data\\\\path/to/file/RandomFile.pdf/")
println extractFilename("/data\\\\path/to/file/RandomFile.pdf")
println extractFilename("/RandomFile.pdf")
println extractFilename("/RandomFile.pdf/")
println extractFilename("/")
打印
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
RandomFile.pdf
/
............................................... ........................编辑......................... ..................................................
Uday的解释。这实际上非常复杂,我不确定今天能不能争论所有这些,但我会尝试一下:)
^[/\\\\]?(?:.+[/\\\\]+?)?(.+?)[/\\\\]?$
0:整个正则表达式
^
1:以
开头[/\\\\]?
2:正斜杠或反斜杠(是的,一个四个斜线,疯了!)。一次或根本没有,所以不需要。
(?:.+[/\\\\]+?)?
3:这一步很复杂。它旨在跳过除最后一个匹配这个确切模式的所有内容,一个非捕获组(?:...我们正在寻找任何字符几次,然后是一个斜杠。
这个小组可以重复多次,但不贪心。所以这是说这样做,除非你匹配4中解释的以下正则表达式。
这整件虽然不是必需的,因为?在括号外面。例如,“/ RandomFile.pdf /”不会在此处生成匹配项,并继续执行4.
然而,现在我觉得这有点奇怪,因为。+贪婪,仍然期待着比赛的斜线。它可能是组的本质,它们是非贪婪的或Java模式语法中的错误。
(.+?)[/\\\\]?$
4:由于正则表达式适用于所有字符串,因此它也必须匹配到结尾。 3上一场比赛是非贪婪的,不情愿使用+ ?,这意味着它只会在正则表达式不匹配后才匹配。我们的结论是在最后$括在括号内,可能会也可能不会以斜线结尾。如果没有文件名,我选择将根路径作为文件名返回,但只是斜杠,因为它也是文件名(目录名)
5:括号是一个捕获组,这是我们最后返回的。
我希望这有点澄清。
答案 3 :(得分:3)
使用替换为正则表达式String name = directory.replaceAll(".*/","")
,简单如此。
答案 4 :(得分:1)
之前的答案都比使用完整的正则表达式更简单。但是,如果你真的想使用一个,那么你可以使用以下正则表达式:“。* /(。+)”
Pattern p = Pattern.compile(".*/(.+)");
Matcher matcher = p.matcher("Payload/brownie.app/Info.plist");
if ( matcher.find() ) {
System.out.println("result: "+matcher.group(1));
}
从其他答案中可以看出,这是比严格需要的更多的代码,但是如果你正在进行更复杂的模式匹配和字符串提取,那么正则表达式是一个很好的方法。
答案 5 :(得分:1)
如果您正在处理浏览器传递给Web服务器的文件路径,则无法确定它是DOS样式路径,Unix样式还是只有没有路径的文件名。如果你真的想要一个RegEx,这应该这样做:
String path = "Payload/brownie.app/Info.plist";
String filename = path.replaceFirst("(^.*[/\\\\])?([^/\\\\]*)$","$2");
无论是DOS,Unix还是缺席路径,都可以使用。
但是,使用子串作为dogbane suggests更加清晰,但添加逻辑来检查两种类型的文件分隔符(同样,只有在处理多平台输入时)。 / p>