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

IT技术 javascript regex filenames
2021-03-11 21:39:10

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

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

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

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

只是为了记录,我在 JavaScript 中这样做

6个回答

只是为了完整性:如果没有正则表达式怎么能做到这一点?

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

|| input需要的情况下,这里的护理lastIndexOf()提供-1你看,它仍然是一个单线。

我非常喜欢你对输入/输出所做的一切!:)
2021-04-20 21:39:10
不错的解决方案!我在 RegEx 上有隧道视觉,但这也有效
2021-04-20 21:39:10
是:jsperf.com/file-extension-extraction然而,这是一个微观优化。因此,如果您只在代码中执行此操作一次,请采用您想要的任何解决方案。如果您每秒执行此操作 1000 次(例如在滚动期间)或在频繁使用的库中执行此操作,则增益将很明显。
2021-04-22 21:39:10
50年后,当文件名像Mb那么长时,人们会像崇拜上帝一样崇拜你。我的意思是人,而不是 IE 用户。
2021-05-09 21:39:10
同样,使用underscore.stringvar output = _s.strLeftBack(input, '.'); // 'myfile'
2021-05-19 21:39:10
/(.*)\.[^.]+$/

结果将在第一个捕获组中。但是,不使用正则表达式,只找到最右边的时间段的位置,然后在它之前的所有内容,可能更有效。

一个几乎完美的解决方案,但是,如果你想避免像 .htaccess 这样的文件名的陷阱(以句点开头,但没有扩展名),如 Roger Pate 的例子,只需用加号代替第一个星号,如下:( .+)\.[^.]+$
2021-04-24 21:39:10
"xxx.xxx.xxx".replace(/(.*)\.[^.]+$/,'') => ""
2021-05-01 21:39:10
还要考虑诸如a.longthingrighthereattheendor .ext& 之类的事情file.也许检查/(.*)\.[^.]{1,10}$/实际上,只需使用pathinfo().
2021-05-02 21:39:10
/^(.+)(\.[^ .]+)?$/

这有效而其他失败的测试用例:

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

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

失败的测试用例:

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

如何处理这些是有问题的,最好根据项目特定的基础来决定。

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

/\.[^.]*$/

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

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

该正则表达式正在返回扩展名,而我需要删除扩展名
2021-04-22 21:39:10
/.\w*$/.exec("myfile.png") => [".png"]
2021-04-23 21:39:10
这是唯一.replace对我有用的答案
2021-04-25 21:39:10
@AndreasGrech 好吧,正则表达式不会删除东西。他们匹配的东西。如果您使用像 SED 这样的程序,那么要删除它,您可以匹配它并用空字符串替换它。当然,其他选项是匹配所有不是扩展名的内容。
2021-05-09 21:39:10
这是一个简单而合理的解决方案,但它在 Roger Pate 给出的一些例外情况下失败了,例如 • 发送给 Mrs。• 项目的 1.2 版 此代码的更精确版本为:\.[^(\.|\s)]+$
2021-05-16 21:39:10
/^(.+)(\.[^ .]+)?$/

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