我可以使用负前瞻功能查找文件路径中的最后一个文件夹来提高简单性吗?

时间:2018-10-24 16:10:28

标签: regex regex-lookarounds subdirectory

我正在尝试找到一种更简单的解决方案,以在文件列表中查找最后一个文件夹路径,该文件列表不包含类型文件,但必须使用环顾四周。谁能在我的正则表达式代码中解释一些改进?

搜索文字:

c:\this\folder\goes\findme.txt
c:\this\folder\cant\findme.doc
c:\this\folder\surecanfind.txt
c:\\anothertest.rtf
c:\t.txt

RegEx:

(?<=\\)[^\\\n\r]+?(?=\\[^\\]*\.)(?!.*\.doc)

预期结果:

‘goes’
‘folder’

RegEx前瞻能否得到改进和简化?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在原始正则表达式中:
(?<=\\)[^\\\n\r]+?(?=\\[^\\]*\.)(?!.*\.doc)

在使用环顾四周方面,实际上并没有太多改进。

当允许正则表达式开始比赛时,必须保持积极的眼神。
要终止+?量词的扩展,必须积极向前。
而且需要否定的前瞻来否定无效匹配。

您也许可以将两者相互融合。但是将它们分开是更有效的,因为如果对一个进行评估失败,则可以跳过对第二个评估。


但是,如果您要寻找更高效/“正常”的正则表达式,通常会使用以下内容:
^.*\\(.+?)\\[^\\]+\.(?!doc).+$

除了使用环顾四周以排除匹配项中所需输出以外的所有内容,我将所需输出包含在捕获组中。
这使我可以告诉正则表达式每行仅检查一次匹配项,而不用再检查\字符之后。

然后,要获得所需的输出,我要做的就是从每次比赛中获取捕获组1的内容。

working example

orignal(98,150步)
Capture Groups(66,586步)

希望能帮到您