[英]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
。 你看,它仍然是一個單行。
/(.*)\.[^.]+$/
結果將在第一個捕獲組中。 但是,在不使用正則表達式的情況下,找到最右邊的位置然后將所有內容都放在它之前可能更有效。
/^(.+)(\.[^ .]+)?$/
測試用例和其他失敗的測試用例:
當然,上面的共同主題是“格式錯誤”的文件擴展名。 但你總是要考慮那些極端情況。 :P
測試失敗的測試用例:
如何處理這些是有問題的,最好在特定項目的基礎上決定。
與模式匹配的正則表達式是:
/\.[^.]*$/
它找到一個句點字符( \\。 ),后跟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問題中可以找到實現替換的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.