You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:41:02