【问题标题】:Regex: Get Filename Without Extension in One Shot?正则表达式:一次性获取没有扩展名的文件名?
【发布时间】:2010-10-12 02:40:45
【问题描述】:

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

([^\.]*)

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

关于大卫的问题,“你为什么要使用正则表达式”,答案是,“为了好玩”。其实我用的代码很简单

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

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

【问题讨论】:

  • Daniel,在这种情况下,我建议您购买 RegexBuddy 之类的工具。如果你有这样的工具,玩正则表达式会更有趣。您甚至可以在这样的工具中调试正则表达式。真的很推荐。
  • 谢谢大卫。我使用 Regex Coach,效果非常好。

标签: regex syntax


【解决方案1】:

试试这个:

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

这将:

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

注意:正如评论者 j_random_hacker 所建议的那样,它的执行方式与宣传的一样,但出于可读性目的,您可能希望在事物前面加上锚。

【讨论】:

  • movingtofreedom.org/2008/04/01/…对此有很好的解释
  • 星号应该是一个加号,我认为 - 虽然不清楚名为“日志”的文件是什么。应该返回。
  • 虽然这确实像宣传的那样工作,但为了便于阅读,我可以建议在前面加上一个“^”锚吗?如果没有锚,第一次看到这个正则表达式的程序员需要执行详细的分析来验证返回的匹配总是从字符串的开头开始。
  • 只有一次捕获:(.+?)(?:\.[^.]*$|$)
  • 使用类似 path/to/file/myfile.csv 的文件时的文件
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 它与没有扩展名的文件名不匹配
【解决方案3】:

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

例如。

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

【讨论】:

  • 没关系,但既然我要扔掉文件名,何必呢?我想要一个只获取文件名的正则表达式。
  • 这个也不会匹配不包含扩展名的文件名。
【解决方案4】:
^(.*)\\(.*)(\..*)$
  1. 获取没有最后一个\的路径
  2. 没有扩展名的文件
  3. 带有.的扩展名

例子:

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

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

【讨论】:

    【解决方案5】:

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

    如果您正在寻找 ~standalone~ 正则表达式

    这将匹配不带点的扩展名

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

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

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

    【讨论】:

    • 这些模式存在一些错误。具体来说,|+ 在字符类 ([]) 中不起作用。
    • 哎呀,修好了。谢谢,这就是我谷歌正则表达式的原因
    【解决方案6】:

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

    再想一想。例如,如果您在 .NET 平台上,请查看 System.IO.Path 类。

    【讨论】:

    • 嗯,这不是很有趣,是吗?无论如何,将问题调整为您的答案,请参见上文。谢谢。
    【解决方案7】:

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

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

    对于这个文本:

    file.ext
       fileext
    
       file.ext.ext
     file.ext
    fileext
    

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

    【讨论】:

      【解决方案8】:

      只是文件名,没有路径和后缀。

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

      【讨论】:

        【解决方案9】:

        试试

        (?<=[\\\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)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-18
          • 2011-04-09
          • 2022-11-19
          • 2010-09-19
          • 1970-01-01
          • 2015-06-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多