簡體   English   中英

正則表達式從路徑獲取帶或不帶擴展名的文件名

[英]Regex to get filename with or without extension from a path

尋找一個正則表達式來提取文件名部分,不包括此代碼中路徑的擴展名

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 請求。

以下正則表達式將匹配所需的部分:

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

解釋:

  • ^匹配行首
  • (?:非捕獲組的開始
    • .*\/匹配到最后一個/字符
  • )? 非捕獲結束(可選)
  • ([^\/]+?|)不貪婪地捕獲除/之外的任何東西或什么都不捕獲
  • (?=積極前瞻的開始
    • (?:\.[^\/.]*)? 匹配擴展名(可選)
    • $斷言行尾
  • )積極前瞻結束

但是,如果您正在處理多行輸入字符串並且需要更快的正則表達式,請嘗試使用這個(打開m標志):

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

在此處查看現場演示

文件名將在第一個捕獲組中捕獲。

您可以在File object 上使用getName() function ,然后使用正則表達式刪除擴展名,您也可以檢查它是否也是文件:

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

使用路徑文件(String pathFile)獲取帶擴展名的名稱文件,並使用FilenameUtils.removeExtension將其刪除

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

String fileNameWithOutExt = FilenameUtils.removeExtension(nameDocument);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM