如何用C#正则IsMatch排除含指定后缀的文件路径?
问题分析与修正方案
你的代码无法排除AnLe_ZANG.xml的核心问题出在正则表达式的断言逻辑上:
- 当前使用的
(?!ZANG)是正向负向先行断言,它仅检查当前位置后面的内容不是"ZANG"。对于C:/path/to/file/AnLe_ZANG.xml,[A-Z0-9_]*会匹配到_ZANG,此时断言检查的是_ZANG之后(.xml之前)的内容——这里是.,并非"ZANG",所以断言成立,正则会匹配该路径,导致目标文件没被排除。
修正方案1:调整正则断言
把正向先行断言换成负向回顾后发断言(?<!ZANG),它会检查当前位置前面的内容不是"ZANG",确保.xml之前的部分不以"ZANG"结尾,精准排除目标文件。
修正后的代码:
string dirPath = "C:/path/to/file/"; string fileNamePre = "AnLe"; // 将(?!ZANG)替换为(?<!ZANG) string regExSuf = @"[A-Z0-9_]*(?<!ZANG)\.xml"; Regex rg = new Regex("^" + dirPath + fileNamePre + regExSuf + "$"); string[] fileNames = new[]{"AnLe.xml","AnLe_ZANG.xml","AnLe_TE.xml"}; IEnumerable<string> resultFilePaths = fileNames .Select(element => dirPath + element) .Where(element => rg.IsMatch(element));
修正方案2:不用正则,直接字符串判断
如果不需要复杂的正则匹配逻辑,直接用字符串判断会更直观易维护:
string dirPath = "C:/path/to/file/"; string[] fileNames = new[]{"AnLe.xml","AnLe_ZANG.xml","AnLe_TE.xml"}; IEnumerable<string> resultFilePaths = fileNames .Select(element => dirPath + element) // 排除文件名以_ZANG.xml结尾的文件 .Where(path => !Path.GetFileName(path).EndsWith("_ZANG.xml", StringComparison.OrdinalIgnoreCase));
内容的提问来源于stack exchange,提问作者koji0285
相关产品推荐
相关产品推荐

