【问题标题】:Regex to get filename with or without extension from a path正则表达式从路径获取带或不带扩展名的文件名
【发布时间】:2020-03-11 08:32:10
【问题描述】:

寻找一个正则表达式来提取文件名部分,不包括此代码中路径的扩展名

String filename = fullpath.replaceFirst(regex, "$1")

例如首先,这是最简单的案例和我所做的:

  • /path/filename.ext -> 文件名 (fullpath.replaceFirst(".*/(.*)\\..*", "$1"))

这里有一些我需要帮助的高级案例:

  • /filename.ext -> 文件名(可以/开头)
  • 文件名。 -> 文件名(可以以 . 结尾)
  • /filename -> 文件名(可以没有.)
  • filename.ext -> 文件名(不能有/)
  • 文件名 -> 文件名(不能有.和/)
  • .filename -> .filename(可以以.开头)
  • /path/.filename -> .filename(可以在/之后以.开头)
  • filename.part1.ext -> filename.part1(可以有中间.)
  • /path_a/path.b/ ->(空字符串)(可以没有文件名)
  • /path_a/path.b/filename -> 文件名(路径中/之前可以有.)

编辑: 这里没有实际文件,fullpath 不会指向任何文件。它来自一个 URL 请求。

【问题讨论】:

  • new File(fullpath).getName()
  • @XtremeBaumer 不幸在上述许多情况下都失败了。
  • 因为你说文件夹不是文件。过滤掉文件夹后,它可以 100% 工作。但是文件夹是文件并且也有名称。扩展名通常也是名称的一部分
  • @XtremeBaumer 我不太确定你在说什么?我试过你的代码,它没有给出正确的答案。而且我没有在任何地方提到文件夹,你为什么说文件夹?
  • /path_a/path.b/ 是文件夹而不是文件的有效路径。然而它仍然有一个名字

标签: java regex string


【解决方案1】:

使用路径文件(String pathFile)获取带扩展名的name文件并用FilenameUtils.removeExtension删除

String nameDocument = pathFile.substring(pathFile.lastIndexOf("/") + 1);

String fileNameWithOutExt = FilenameUtils.removeExtension(nameDocument);

【讨论】:

  • 嘿,谢谢。我想这对其他人有帮助。但就我而言,似乎“/path/.filename”没有使用该实用程序给出“.filename”。
【解决方案2】:

以下正则表达式将匹配所需部分:

^(?:.*\/)?([^\/]+?|)(?=(?:\.[^\/.]*)?$)

解释:

  • ^匹配行首
  • (?: 非捕获组的开始
    • .*\/ 匹配到最后一个 / 字符
  • )?非捕获结束(可选)
  • ([^\/]+?|) 捕获任何东西,但 / 不贪婪地或什么都没有
  • (?= 积​​极前瞻的开始
    • (?:\.[^\/.]*)? 匹配扩展名(可选)
    • $断言行尾
  • ) 正向预测结束

但如果您正在处理多行输入字符串并且需要更快的正则表达式,请尝试使用这个(打开m 标志):

^(?:[^\/\r\n]*\/)*([^\/\r\n]+?|)(?=(?:\.[^\/\r\n.]*)?$)

live demo here

文件名将在第一个捕获组中捕获。

【讨论】:

  • 非常感谢,你的好像在演示中工作,但我不能把它放在我的java代码中,看起来语法有点不同?
  • @user1589188 是的,你需要两个反斜杠在哪里。
  • @user1589188 您不应该在这里使用替换方法,但如果必须,您应该将正向前瞻更改为简单的匹配集群:"/path/filename.ext".replaceFirst("^(?:.*\\/)?([^\\/]+?|)(?:\\.[^\\/.]*)?$", "$1")
  • @user1589188 这也很有帮助regex101.com/r/9FUtDb/1/codegen?language=java
  • 非常令人印象深刻!干得好@revo!效果很好,你的解释很完美,谢谢。
【解决方案3】:

您可以在File 对象上使用getName() 函数,然后使用正则表达式删除扩展名,您也可以检查它是否也是一个文件:

File file = new File(fullpath);
if (file.isFile()) return file.getName().replace("\..*", "");
else return "";

【讨论】:

  • 谢谢,但我没有处理实际文件。事实上,我正在处理一个请求 URL,所以没有文件可供我检查。
  • 不用担心,感谢您的意见。如果其他人有文件要处理,应该会对他们有所帮助。
  • @XtremeBaumer isFile() 检查是否真的适用于文件系统上不存在的路径?
  • 如果文件实际上不存在,则isFile()isDirectory()都返回false
  • 但是OP是对的,如果他没有磁盘上的文件,这个方法就行不通了。
猜你喜欢
  • 2022-11-19
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多