提问人:Mmb423 提问时间:10/25/2023 最后编辑:anubhavaMmb423 更新时间:10/26/2023 访问量:56
正则表达式匹配文件名中的字符串,同时排除另一个字符串
Regex matching a string in a filename while excluding another string
问:
我正在使用正则表达式搜索文件夹以查找与某些字符串匹配的文件,但我还需要排除其他字符串。例如,在下面的路径中,我需要仅从文件名(而不是路径)返回包含字符串“MVP”的文件的匹配项。如果文件名中包含字符串“Missing”(而不是来自路径),我需要它不匹配。文件类型还需要是 .csv、.txt、.xlsx 或 .xls。
\\p8files\MVP\Inbound\2023\202310\20231016\BillingProvEntityFix1016.xlsx
\\p8files\MVP\Inbound\2023\202310\20231016\BillingProv_MVP_EntityFix1016.xlsx
\\p8files\MVP\Inbound\2023\202310\20231016\BillingProv_MVP_Entity_MissingFix1016.xlsx
在上面的 3 个示例中,结果为:
- 不匹配 - 文件名中缺少“MVP”(不是来自路径)
- match - 文件名中包含“MVP”,文件名中不包含“Missing”
- 不匹配 - 文件名中包含“MVP”,但文件名中包含“Missing”
我尝试使用以下正则表达式,但它返回所有匹配项,因为“MVP”位于文件路径中。
^.*(?=^.*MVP)(?!^.*Missing).*(\.csv|\.xls|\.xlsx|\.txt)$
也试过这个,它只搜索文件名,就像我需要的那样,但我无法弄清楚如何从文件名中排除“丢失”。
\b.*MVP[^\\]*(\.csv|\.xls|\.xlsx|\.txt)$
任何帮助将不胜感激,谢谢!
马 特
答:
1赞
anubhava
10/25/2023
#1
此正则表达式应该适合您:
^(?=.*MVP[^\\]*$)(?!.*Missing[^\\]*$).*\.(?:csv|xlsx?|txt)$
正则表达式详细信息
^
:开始(?=.*MVP[^\\]*$)
:积极展望以断言在文件名部分(而不是路径)中找到,因为将确保没有匹配后MVP
[^\\]*$
\
MVP
(?!.*Missing[^\\]*$)
:在文件名部分(非路径)中找到匹配失败的否定展望Missing
.*
:匹配任何文本\.
:匹配一个点(?:csv|xlsx?|txt)
:匹配以下扩展名之一$
:结束
评论
1赞
Mmb423
10/25/2023
这很完美!感谢您的帮助,包括正则表达式详细信息,这非常有帮助!
1赞
sln
10/25/2023
#2
如果您只想将文件名与这些条件匹配
(?=[^\\]*MVP[^\\]*$)(?!.*Missing).*\.(?:csv|txt|xlsx?)$
评论
if filename matches X and doesn't match Y
find
find . -regex X ! -regex Y