删除文件扩展名的正则表达式

问题描述 投票:0回答:9

我需要一个正则表达式,可以删除文件名的扩展名,仅返回文件名。

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

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

我显然可以手动执行此操作(即删除最后一个点中的所有内容),但我确信有一个正则表达式可以自行执行此操作。

仅供记录,我正在 JavaScript 中执行此操作

javascript regex filenames
9个回答
97
投票

为了完整起见:如果没有正则表达式,如何实现这一点?

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

|| input
负责处理这种情况,其中
lastIndexOf()
提供
-1
。你看,这仍然是一句台词。


50
投票
/(.*)\.[^.]+$/

结果将位于第一个捕获组中。然而,只找到最右边句点的位置,然后获取它之前的所有内容,而不使用正则表达式,可能会更有效。


20
投票

匹配模式的正则表达式是:

/\.[^.]*$/

它找到一个句点字符 (\.),后跟 0 个或多个非句点字符 ([^.]*),最后是字符串结尾 ($)。

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


12
投票
/^(.+)(\.[^ .]+)?$/

此方法有效而其他方法失败的测试用例:

  • “.htaccess”(领先时期)
  • “文件”(无文件扩展名)
  • “送给夫人。” (没有扩展名,但以缩写结尾。)
  • “项目版本 1.2”(无扩展名,但仍包含句点)

上面的共同点当然是“格式错误”的文件扩展名。但你总是必须考虑那些极端情况。 :P

失败的测试用例:

  • “版本 1.2”(没有文件扩展名,但“似乎”有一个)
  • “name.tar.gz”(如果您将其视为“复合扩展名”并希望将其拆分为“name”和“.tar.gz”)

如何处理这些问题是有问题的,最好根据项目的具体情况来决定。


5
投票
/^(.+)(\.[^ .]+)?$/

上面的模式是错误的 - 它总是包含扩展名。这是因为 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提到的所有情况,但也包括完整路径


3
投票

另一种无正则表达式的方法(@Rahul 版本的“相反”,不使用 pop() 来删除)

不需要两次引用变量,因此更容易内联

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

0
投票

这也可以做到:)

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

不过我会坚持使用正则表达式...=P


0
投票
  return filename.split('.').pop();

它会让你的愿望成真。但不是正则表达式方式。


-2
投票

在 javascript 中,您可以调用 Replace() 方法,该方法将根据正则表达式进行替换。

此正则表达式将匹配从行首到行尾的所有内容,并删除最后一个句点(包括句点)之后的所有内容。

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

如何实现替换可以在这个 Stackoverflow 问题中找到。

Javascript正则表达式问题

© www.soinside.com 2019 - 2024. All rights reserved.