正则表达式匹配文件名中的字符串,同时排除另一个字符串

Regex matching a string in a filename while excluding another string

提问人:Mmb423 提问时间:10/25/2023 最后编辑:anubhavaMmb423 更新时间:10/26/2023 访问量:56

问:

我正在使用正则表达式搜索文件夹以查找与某些字符串匹配的文件,但我还需要排除其他字符串。例如,在下面的路径中,我需要仅从文件名(而不是路径)返回包含字符串“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 个示例中,结果为:

  1. 不匹配 - 文件名中缺少“MVP”(不是来自路径)
  2. match - 文件名中包含“MVP”,文件名中不包含“Missing”
  3. 不匹配 - 文件名中包含“MVP”,但文件名中包含“Missing”

我尝试使用以下正则表达式,但它返回所有匹配项,因为“MVP”位于文件路径中。

^.*(?=^.*MVP)(?!^.*Missing).*(\.csv|\.xls|\.xlsx|\.txt)$

也试过这个,它只搜索文件名,就像我需要的那样,但我无法弄清楚如何从文件名中排除“丢失”。

\b.*MVP[^\\]*(\.csv|\.xls|\.xlsx|\.txt)$

任何帮助将不胜感激,谢谢!

马 特

表达式正则表达式环视

评论

2赞 Barmar 10/25/2023
您是否必须在单个正则表达式中执行此操作?如果作为单独的操作进行操作,则更容易。if filename matches X and doesn't match Y
0赞 Barmar 10/25/2023
您可以使用以下方式轻松做到这一点find find . -regex X ! -regex Y
0赞 Barmar 10/25/2023
如果你在一个正则表达式中需要它,你可以使用负前瞻(如果它是 PCRE)。

答:

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?)$

https://regex101.com/r/zi8sKY/1