正则表达式:一次性获取没有扩展名的文件名?

Dan*_*ark 13 regex syntax

我想使用正则表达式获取文件名,所以我一直在尝试简单的事情

([^\.]*)
Run Code Online (Sandbox Code Playgroud)

这当然只有在文件名有一个扩展名时才有效.但如果是adfadsfads.blah.txt我想要的话adfadsfads.blah.我怎么能用正则表达式做到这一点?

关于David的问题,'为什么你会使用正则表达式',答案是'为了好玩'.事实上,我使用的代码很简单

length_of_ext = File.extname(filename).length
filename = filename[0,(filename.length-length_of_ext)]
Run Code Online (Sandbox Code Playgroud)

但我喜欢尽可能地学习正则表达式,因为它总是出现在极客鸡尾酒派对上.

Joh*_*lla 37

试试这个:

(.+?)(\.[^.]*$|$)
Run Code Online (Sandbox Code Playgroud)

这将:

  • 捕获以点开头的文件名(例如".logs"是名为".logs"的文件,而不是文件扩展名),这在Unix中很常见.
  • 获取除最后一个点之外的所有内容:"foo.bar.jpeg"获取"foo.bar".
  • 处理没有点的文件:"秘密信"让你"秘密信".

注意:正如评论者j_random_hacker建议的那样,它的表现与广告一样,但出于可读性考虑,您可能希望在事物之前加上一个锚点.

  • 只有一次捕获:(.+?)(?:\.[^.]*$ | $) (3认同)
  • 在 http://www.movi​​ngtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/ 上有一个很好的解释 (2认同)