Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式从路径中删除所有目录名(保留文件名)_Java_Regex_String - Fatal编程技术网

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

Java 正则表达式从路径中删除所有目录名(保留文件名),java,regex,string,Java,Regex,String,我想从路径中删除所有目录名: Payload/brownie.app/Info.plist 应该成为 Info.plist 我应该使用什么正则表达式,或者可以使用java中字符串中的replace()? 谢谢 使用replace with regex,String name=directory.replaceAll(“.*/”,“”),就这么简单 您不需要正则表达式。只需找到最后一条斜线并使用子字符串: int index = path.lastIndexOf(File.separatorC

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

Payload/brownie.app/Info.plist
应该成为

Info.plist
我应该使用什么正则表达式,或者可以使用java中字符串中的replace()?
谢谢

使用replace with regex,
String name=directory.replaceAll(“.*/”,“”)
,就这么简单

您不需要正则表达式。只需找到最后一条斜线并使用子字符串:

int index = path.lastIndexOf(File.separatorChar);
String name = path.substring(index+1);
或使用:

new File(path).getName();
试试这个:

new File("Payload/brownie.app/Info.plist").getName()
这将返回不带目录的文件名

例如:

String filename = new File("Payload/brownie.app/Info.plist").getName();
System.out.println(filename);
输出:

Info.plist

前面的答案都比使用完整的正则表达式简单。但是,如果您真的想使用一个正则表达式,那么可以使用以下正则表达式模式:“*/(.+)”


从其他答案中可以看出,这是比严格要求更多的代码,但如果您正在进行更复杂的模式匹配和字符串提取,则正则表达式是一种很好的方法。

如果您处理的是一个由浏览器传递到web服务器的文件路径,您无法确定它是否是DOS样式的路径,Unix样式,或者只是一个没有路径的文件名。如果你真的想要一个正则表达式,这应该可以做到:

String path = "Payload/brownie.app/Info.plist";
String filename = path.replaceFirst("(^.*[/\\\\])?([^/\\\\]*)$","$2");
无论是否存在DOS、Unix或不存在路径,这都将起作用


不过,使用子字符串作为分隔符会更清晰,但添加逻辑来检查这两种类型的文件分隔符(同样,只有在处理多平台输入时才这样做)。

这涵盖了所有Spectrum目录,包括尾随或起始斜杠

到目前为止这里的所有其他人都不

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模式语法中的一个bug

(.+?)[/\\\\]?$
4:因为正则表达式适用于所有字符串,所以它也必须匹配到最后一个。之前在3处的匹配是非贪婪的,不愿意使用+?,这意味着它只会匹配不匹配后的正则表达式。我们的单词在结尾$在括号内,可能以斜杠结尾,也可能不以斜杠结尾。我选择返回根如果没有文件名,但只有一个斜杠,则路径作为文件名,因为它也是一个文件名(目录名)

5:括号是一个捕获组,这是我们在结尾返回的


我希望这能澄清一点。

不是Regex,而是最好的(面向对象、可读性)解决方案(IMO:+1我同意你的观点,@Carlos Heuberger;)如果你正在使用的路径可能来自其他操作系统(例如Linux Web服务器解析上传文件的DOS路径),请小心使用
File.getName()
File.getName()
仅剥离操作系统认为是目录的内容。“C:\somedir\myfile.txt”在Linux上是一个完全有效的文件名。此解决方案的问题是,您可以有如下URL:…/somepage.html?rurl=/x/y/z/something.htmlaso,请确保检查极端情况,例如文件位于根文件夹中或路径为空
if(path==null)返回null;int index=path.lastIndexOf(File.separatorChar);String name=path.substring(索引+1);返回索引==-1?null:path.substring(0,索引);如果文件名以斜杠结尾,则不起作用。如果文件名没有路径(相对文件)并且只是一个文件名,则该文件将不起作用。不适用于目录名,只适用于根目录的“斜杠”。不适用于反向斜杠和来自其他系统的混合斜杠路径(窗口)。更好的是,只需使用更简单的正则表达式(我不知何故忽略了它),但在其中添加反斜杠:
“*[/\\\]”“
这对我来说非常有效。我有一个包含/和\(从ARM的一些编译器获得)的路径。这个正则表达式工作得很好。你能把正则表达式的解释写下来吗。Java正则表达式让我很困惑。我添加了一个解释(uday;)这是唯一对我有用的。我在windows上开发,但在Linux上运行服务,用户使用Internet Explorer从windows上传文件。在本例中,我将使用带反斜杠的文件名。codelahoma的评论帮助我将注意力集中在这个解决方案上。如果文件名以斜杠结尾,它将不起作用。如果文件名没有路径(相对文件),则将不起作用。不适用于目录名,只适用于根目录的“斜杠”。不适用于反向斜杠和混合斜杠路径(窗口)。
(?:.+[/\\\\]+?)? 
(.+?)[/\\\\]?$