簡體   English   中英

正則表達式刪除文件的擴展名

[英]Regular expression to remove a file's extension

我需要一個正則表達式,可以刪除文件名的擴展名,只返回文件的名稱。

以下是輸入和輸出的一些示例:

myfile.png     -> myfile
myfile.png.jpg -> myfile.png

我顯然可以手動執行此操作(即從最后一個點刪除所有內容),但我確信有一個正則表達式可以自己執行此操作。

只是為了記錄,我在JavaScript中這樣做

只是為了完整性:如果沒有正則表達式,如何才能實現這一目標?

var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;

|| input || input處理大小寫,其中lastIndexOf()提供-1 你看,它仍然是一個單行。

/(.*)\.[^.]+$/

結果將在第一個捕獲組中。 但是,在不使用正則表達式的情況下,找到最右邊的位置然后將所有內容都放在它之前可能更有效。

/^(.+)(\.[^ .]+)?$/

測試用例和其他失敗的測試用例:

  • “.htaccess”(領先期)
  • “文件”(沒有文件擴展名)
  • “送給夫人。” (沒有擴展名,但以abbr結尾)
  • “項目1.2版”(沒有擴展名,但仍包含一段時間)

當然,上面的共同主題是“格式錯誤”的文件擴展名。 但你總是要考慮那些極端情況。 :P

測試失敗的測試用例:

  • “版本1.2”(沒有文件擴展名,但“看起來”有一個)
  • “name.tar.gz”(如果您將其視為“復合擴展”並希望將其拆分為“name”和“.tar.gz”)

如何處理這些是有問題的,最好在特定項目的基礎上決定。

與模式匹配的正則表達式是:

/\.[^.]*$/

它找到一個句點字符( \\。 ),后跟0個或更多不是句點( [^。] * )的字符,后跟字符串的結尾( $ )。

 console.log( "aaa.bbb.ccc".replace(/\\.[^.]*$/,'') ) 

/^(.+)(\.[^ .]+)?$/

上面的模式是錯誤的 - 它也將始終包括擴展。 這是因為javascript正則表達式引擎的工作原理。 (\\.[^ .]+)標記是可選的,因此引擎將成功匹配整個字符串(.+) http://cl.ly/image/3G1I3h3M2Q0M


這是我測試的正則表達式解決方案。

該模式將在路徑中匹配帶有/不帶擴展名的filenameNoExt,同時遵循斜杠和反斜杠分隔符

var path = "c:\some.path/subfolder/file.ext"
var m = path.match(/([^:\\/]*?)(?:\.([^ :\\/.]*))?$/)
var fileName = (m === null)? "" : m[0]
var fileExt  = (m === null)? "" : m[1]

解剖上述模式:

([^:\\/]*?)  // match any character, except slashes and colon, 0-or-more times,
             // make the token non-greedy so that the regex engine
             // will try to match the next token (the file extension)
             // capture the file name token to subpattern \1

(?:\.        // match the '.' but don't capture it
([^ :\\/.]*) // match file extension
             // ensure that the last element of the path is matched by prohibiting slashes
             // capture the file extension token to subpattern \2
)?$          // the whole file extension is optional

http://cl.ly/image/3t3N413g3K09

http://www.gethifi.com/tools/regex

這將涵蓋@RogerPate提到的所有案例,但也包括完整路徑

另一種非正則表達方式(@ Rahul版本的“oposite”,不使用pop()刪除)

它不需要兩次引用變量,因此內聯更容易

filename.split('.').slice(0,-1).join()

這樣做也是:)

'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');

我堅持使用正則表達式但是... = P.

  return filename.split('.').pop();

它會讓你的願望成真。 但不是正則表達方式。

在javascript中,您可以調用將基於正則表達式替換的Replace()方法。

這個正則表達式將匹配從行的開頭到結尾的所有內容,並刪除包括句點在內的最后一個句點之后的所有內容。

/^(.*)\..*$/

在Stackoverflow問題中可以找到實現替換的方法。

Javascript正則表達式問題

暫無
暫無

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

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