[英]Extract Filenames from a list of files including Full-Path in Notepad++
我有一个列表,其中包含像这样的文本文件中的数千个文件:
C:\AAAA\BBB\CCC\file1.dat
D:\AAAA\FF FF F\CCC\file 2.dat
D:\ANN NN\BBB\CCC\The.Third.File.dat
我只想保留这样的文件名:
file1
file 2
The.Third.File
我该怎么做? 也许有人可以用 RegEx 来做?
我可以在 Delphi(我掌握的语言)中这样做:
var
St: TStringList;
i: Integer;
begin
st := TStringList.Create;
try
st.LoadFromFile('F:\TheFile.txt');
for i := 0 to st.Count - 1 do
st[i] := ChangeFileExt(ExtractFileName(st[i]), '');
st.SaveToFile('F:\TheFile.txt');
finally
st.Free;
end;
end;
但我想在 NotePad++ 中学习它。
只需在Notepad++中使用搜索并替换为搜索字段:
^.*\\
并设置一个空的替换值。
然后选择正则表达式,不要勾选.
匹配新行。
在这里解释和测试: https://regex101.com/r/8Fp6E6/1
^
在一行的开头断言 position。.
匹配任何字符(行终止符除外)。*
在零次和无限次之间匹配前一个标记,尽可能多次,根据需要回馈(贪婪)。\\
匹配字符\
。 如您所见,想法是去掉文件名前的路径。 我们利用了这样一个事实,即默认情况下.*
匹配任何东西,直到一个\
字符,但是通过贪婪的方式继续直到它可以。 不贪婪的模式将由^.*?\\
并且在这种情况下它只会摆脱驱动器和第一个反斜杠。
如果您只想通过搜索任何不是反斜杠并后跟行尾的内容来搜索文件,那么您可以搜索以下内容:
[^\\]+$
解释:
[^... ]
匹配任何不在给定列表 (...) 中的字符。[^\\]
匹配任何不是反斜杠的字符。+
与前一个标记匹配一次或多次。 它类似于*
但我们不想匹配零次,所以这就是我们使用+
而不是*
的原因。$
匹配行尾。要同时删除路径和扩展名,您必须匹配整行并用括号捕获您想要的部分(不带扩展名的文件名)并使用捕获的内容作为替换。 搜索模式:
^.*\\([^\\]+?)(?:\.\w+)?$
替换字段: $1
(= 捕获组编号 1)
解释:
^.*\\
和以前一样匹配路径。([^\\]+?)
将以不友好的方式捕获文件名部分。(?:\.\w+)?$
将匹配点和文件扩展名(如果存在):
\.
匹配点字符。\w
匹配任何单词 char 并且等效于[a-zA-Z0-9_]
。(?: )
是一个非捕获组。 我们使用它是因为我们想说文件扩展名是可选的,后面有一个问号: (?:\.\w+)?
.$
匹配行尾。要在最后一个\
之后保留文件名,您可以使用模式来匹配前导字符 AZ 后跟:\
然后可选择匹配直到最后一个\
找什么
^[A-Z]:\\(?:.*\\)?
模式匹配:
^
字符串开始[AZ]:\\
匹配单个字符 AZ 然后:\
(?:.*\\)?
可选择匹配该行的 rest 直到最后一次出现\
用。。。来代替
留空
如果你想删除扩展名,并且作为最后一个点之后的字符,你可以匹配你想要删除的内容并使用捕获组来保留你想要保留的内容。
在替换中使用标记为$1
的捕获组 1 值
假设没有\
或.
或扩展名中的空格:
^[A-Z]:\\(?:.*\\)?([^\r\n\\]+)\.[^\\.\s]+$
模式匹配:
^
字符串开始[AZ]:\\
匹配单个字符 AZ 然后:\
(?:.*\\)?
可选择匹配该行的 rest 直到最后一次出现\
(
捕获组 1
[^\r\n\\]+
匹配除换行符或\
以外的 1+ 个字符)
关闭组 1\.[^\\.\s]+
匹配.
和除\
以外的 1+ 个字符.
或空白字符$
字符串结束查看另一个regex101 演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.