使用正则表达式查看文件名是否也是路径名的一部分

时间:2014-11-18 00:21:09

标签: regex

我想做一些看似简单的事情,但我最终可能会编写一个程序来进行搜索。

我在VB.NEt工作很多项目。文件夹结构是我认为相当普遍的。例如,我的项目名为'SalesLabrary',然后它将具有以下文件夹结构:

<Projects Folder>\SalesLibrary\SalesLibrary

在此文件夹中,我有bin,obj,Resources和My Project文件夹。 现在在bin文件夹下我有release和debug文件夹。当然,在开发过程中,我的输出将进入调试文件夹,但我的最终版本会进入发布文件夹。

我的问题是,有时候我会更新我的存储库,我会保留大约120个应用程序扩展的输出。

无论如何,Release文件夹通常包含主DLL,但也包含我在项目中所做的任何引用的DLL。

因此,在销售库的release文件夹中,我将SalesLibrary.DLL,还有SalesTaxLibrary.dll。 2的路径如下:

<Project Folder>\SalesLibrary\SalesLibrary\bin\Release\SalesLibary.dll
<Project Folder>\SalesLibrary\SalesLibrary\bin\Release\SalesTaxLibary.dll

我想弄清楚的是如何构建一个正则表达式我可以用来选择这些文件,其中文件名(没有扩展名)与其路径中的一个组件匹配(即\SalesLibrary\SalesLibary.dll)如果是这样,返回true。在上面的第一个文件中,SalesLibrary在其路径中存在多次,并且将被选中。

我的正则表达式技能低于标准杆,我真的很难用这个。或者,我一直想学习一些Java。

1 个答案:

答案 0 :(得分:2)

这是执行此操作的天真方法:

  1. 捕获文件名(不带扩展名)
  2. 检查路径的前几部分是否出现该文件名
  3. 如果文件名只找到一次(即从未再次匹配),则正则表达式匹配/失败
  4. Bummer,正则表达式从左到右工作,但文件名位于字符串的末尾。所以我们必须找到一种方法来匹配文件名 first ,然后检查字符串的其余部分。


    方法一

    反转字符串,使用上述方法。

    1. 反转字符串

      @"lld.yrarbiLselaS\yrarbiLselaS\foo\:C"
      
    2. 捕获没有扩展名的文件名(反向,即扩展名优先):^[^.]+\.([^\\]+),即

      ^             # start-of-string
      [^.]+         # extension
      \.            # a dot
      ([^\\]+)      # filename (anything but backslashes), capture to group 1
      
    3. 检查第1组路径的以下部分:(?:\\(?!\1)[^\\]+)*,即:

      (?:           # non-capturing group, matches one path component
        \\            # a backslash
        (?!\1)        # look-ahead: anything but group 1 is allowed
        [^\\]+        # match it
      )*            # end group, repeat
      $             # end-of-string
      
    4. 在一个部分中:^[^.]+\.([^\\]+)(?:\\(?!\1)[^\\]+)*$

      如果匹配,则文件名在路径中的任何其他位置重复。 (不要忘记以前改变路径。)


      方法二

      使用.NET正则表达式引擎的可变长度后视功能从最后汇总字符串。

      1. 保留字符串

        @"C:\foo\SalesLibrary\SalesLibrary.dll"
        
      2. 获取文件名:([^\\]+)\.[^.]+$,即

        ([^\\]+)      # filename (anything but backslashes), capture to group 1
        \.            # a dot
        [^.]+         # extension
        $             # end-of-string
        
      3. 在第1组之后
      4. ,插入一个直到字符串开头的后视镜

        (?<=          # positive look-behind, i.e. it must be true that:
          ^             # start-of-string
          (?:           # non-capturing group, matches a path component 
            (?!\1)        # look-ahead: anything but group 1 is allowed
            [^\\]*        # match it
            \\            # a backslash
          )*            # end group, repeat
          \1            # match the filename again (see note below)
        )             # end look-behind
        
      5. 在一个部分中:([^\\]+)(?<=^(?:(?!\1)[^\\]*\\)*\1)\.[^.]+$

        注意:由于我们在文件名和扩展名之间插入了后视,我们需要在后视中匹配文件名本身,因为它是我们所看到的内容的一部分。

        与以前一样,如果匹配,则文件名在路径中的任何其他位置重复。


        方法三

        抓住文件名,在反斜杠上拆分路径,循环查找匹配的数组。

        坦率地说,这就是我要做的。上面的正则表达式纯粹是学术性的。