正则表达式从路径中删除所有目录名(保留文件名)

时间:2011-01-29 18:45:59

标签: java regex string

我想从路径中删除所有目录名:

Payload/brownie.app/Info.plist

应该成为

Info.plist

我应该使用什么正则表达式,还是可以在java中使用String中的replace()? 谢谢!

6 个答案:

答案 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>