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

Regex 使用正则表达式查看文件名是否也是路径名的一部分,regex,Regex,我想做一些看似简单的事情,但我可能最终会编写一个程序来进行搜索 我在VB.NEt中从事许多项目。文件夹结构是我假设的相当常见的结构。例如,我的项目的一部分称为“SalesLabrary”,那么它将具有以下文件夹结构: <Projects Folder>\SalesLibrary\SalesLibrary 我想弄清楚的是如何构建一个正则表达式,我可以使用它来选择文件名(不带扩展名)与其路径中的一个组件匹配的文件(即\SalesLibrary\SalesLibary.dll),如果是,

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

我在VB.NEt中从事许多项目。文件夹结构是我假设的相当常见的结构。例如,我的项目的一部分称为“SalesLabrary”,那么它将具有以下文件夹结构:

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


我的ReXEX技能低于标准杆,我真的很难用这个。或者,我一直想要一个学习Java的理由。

下面是一个简单的方法:

  • 捕获文件名(不带扩展名)
  • 检查路径的前面部分是否出现该文件名
  • 如果只找到一次文件名(即不再匹配),则让正则表达式匹配/失败
  • 糟糕的是,正则表达式从左到右工作,但文件名在字符串的末尾。因此,我们必须找到一种方法,首先匹配文件名,然后检查字符串的其余部分


    方法一

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

  • 把绳子倒过来

    @"lld.yrarbiLselaS\yrarbiLselaS\foo\:C"
    
    @"C:\foo\SalesLibrary\SalesLibrary.dll"
    
    (?<=          # 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
    
  • 捕获不带扩展名的文件名(反向,即首先扩展名):
    ^[^.]+\([^\\]+)
    ,这是

    ^             # start-of-string
    [^.]+         # extension
    \.            # a dot
    ([^\\]+)      # filename (anything but backslashes), capture to group 1
    
  • 检查组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
    
  • 在一部分中:
    ^[^.]+\.([^\\]+)(?:\\(?!\1)[^\\]+)*$

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


    方法二

    使用.NET正则表达式引擎的可变长度查找功能从末尾向上滚动字符串

  • 守住绳子

    @"lld.yrarbiLselaS\yrarbiLselaS\foo\:C"
    
    @"C:\foo\SalesLibrary\SalesLibrary.dll"
    
    (?<=          # 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
    
  • 获取文件名:
    ([^\\]+)\.[^.]+$
    ,即

    ([^\\]+)      # filename (anything but backslashes), capture to group 1
    \.            # a dot
    [^.]+         # extension
    $             # end-of-string
    
  • 在组1之后,在后面插入一个look,直到字符串开始

    @"lld.yrarbiLselaS\yrarbiLselaS\foo\:C"
    
    @"C:\foo\SalesLibrary\SalesLibrary.dll"
    
    (?<=          # 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
    

    (?到目前为止您尝试了什么,为什么/在什么情况下失败了?此信息可帮助我们确定您的错误所在。(因为除非我在这里遗漏了什么,否则使用正则表达式在字符串中查找简单的单词并不难。)@Tomalak假设示例路径被反斜杠分割,比如
    \1\2\3\4\5.dll
    我想他要求一个正则表达式来测试“如果5==4或5==3或5==2或5==1”。因此
    SalesLibrary\SalesLibrary.dll
    将匹配,并且
    SalesLibrary\SalesTaxLibrary.dll
    将失败。是的,测试字符串中的单词,但该单词是从字符串中提取的。听起来确实是一种简单的解决方法,但这项工作的一部分是学习更多的正则表达式。