我想做一些看似简单的事情,但我最终可能会编写一个程序来进行搜索。
我在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。
答案 0 :(得分:2)
这是执行此操作的天真方法:
Bummer,正则表达式从左到右工作,但文件名位于字符串的末尾。所以我们必须找到一种方法来匹配文件名 first ,然后检查字符串的其余部分。
方法一
反转字符串,使用上述方法。
反转字符串
@"lld.yrarbiLselaS\yrarbiLselaS\foo\:C"
捕获没有扩展名的文件名(反向,即扩展名优先):^[^.]+\.([^\\]+)
,即
^ # 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正则表达式引擎的可变长度后视功能从最后汇总字符串。
保留字符串
@"C:\foo\SalesLibrary\SalesLibrary.dll"
获取文件名:([^\\]+)\.[^.]+$
,即
([^\\]+) # filename (anything but backslashes), capture to group 1
\. # a dot
[^.]+ # extension
$ # end-of-string
,插入一个直到字符串开头的后视镜
(?<= # 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
在一个部分中:([^\\]+)(?<=^(?:(?!\1)[^\\]*\\)*\1)\.[^.]+$
注意:由于我们在文件名和扩展名之间插入了后视,我们需要在后视中匹配文件名本身,因为它是我们所看到的内容的一部分。
与以前一样,如果匹配,则文件名不在路径中的任何其他位置重复。
方法三
抓住文件名,在反斜杠上拆分路径,循环查找匹配的数组。
坦率地说,这就是我要做的。上面的正则表达式纯粹是学术性的。