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

时间:2009-03-09 02:55:37

标签: regex syntax

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

([^\.]*)

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

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

length_of_ext = File.extname(filename).length
filename = filename[0,(filename.length-length_of_ext)]

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

9 个答案:

答案 0 :(得分:37)

试试这个:

(.+?)(\.[^.]*$|$)

这将:

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

注意:正如评论者j_random_hacker所建议的那样,这与广告一样,但为了便于阅读,您可能希望在事物之前加上一个锚。

答案 1 :(得分:4)

所有内容后跟一个点后跟一个或多个不是点的字符,后跟字符串结尾:

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

将最后一个点之前的所有内容分组以便于检索。

如果您不是100%确定每个文件都有扩展名,请尝试:

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

答案 2 :(得分:3)

2对于结尾捕获一个,为文件名捕获一个。

例如

(.+?)(?:\.[^\.]*$|$)

答案 3 :(得分:1)

^(.*)\\(.*)(\..*)$
  1. 获取没有最后\
  2. 的路径
  3. 没有扩展名的文件
  4. 带有.
  5. 的扩展程序

    示例:

    c:\1\2\3\Books.accdb
    (c:\1\2\3)(Books)(.accdb)

    文件名中不支持多个. 是否支持文件路径中的.

答案 4 :(得分:1)

我意识到这个问题有点过时了,但是,我在找到一个好的来源时遇到了一些麻烦,最终自己制作了正则表达式。为了拯救可能找到这个时间的人,

如果您正在寻找~独立的~正则表达式

这将匹配没有点的扩展

\w+(?![\.\w])

这将始终匹配文件名如果它有扩展名

[\w\. ]+(?=[\.])

答案 5 :(得分:0)

好的,我不知道为什么我会使用正则表达式。如果我知道该字符串是一个完整的文件路径,那么我将使用另一个API来获取文件名。正则表达式非常强大但同时相当复杂(您刚刚通过询问如何创建这样一个简单的正则表达式来证明)。有人说:你有一个问题,你决定使用正则表达式来解决它。现在你有两个问题。

再想一想。例如,如果您使用的是.NET平台,请查看System.IO.Path类。

答案 6 :(得分:0)

我使用这种模式进行简单搜索:

^\s*[^\.\W]+$

本文:

file.ext
   fileext

   file.ext.ext
 file.ext
fileext

它在第二行和最后一行中找到fileext 我将它应用于文件夹的文本树视图(空格为缩进)。

答案 7 :(得分:0)

只是文件名,不带路径和后缀。

application/json

答案 8 :(得分:0)

试试

(?<=[\\\w\d-:]*\\)([\w\d-:]*)(?=\.[\.\w\d-:]*)

仅捕获整个文件路径中的任何类型的文件名。故意排除文件路径和文件扩展名

等等:

C:\Log\test\bin\fee105d1-5008-410c-be39-883e5e40a33d.pdf
  • 不捕获(C:\Log\test\bin)
  • 捕获 (fee105d1-5008-410c-be39-883e5e40a33d)
  • 不捕获(.pdf)