C#中Regex.IsMatch匹配目标目录失效,求技术帮助
解决C# Regex.IsMatch匹配目录失效的问题
刚接触C#遇到正则匹配问题很正常,我来帮你拆解下问题所在:
你的正则为什么不生效?
你写的正则"([A-Z]+_TestData)[^_manifest]"存在两个关键逻辑错误:
[^_manifest]是字符类,不是字符串匹配:它的意思是「匹配任意一个不在_、m、a、n、i、f、e、s、t这些字符里的单个字符」,而不是你想的「排除_manifest这个完整字符串」。- 强制要求后面必须有一个字符:这个正则需要
XXX_TestData后面跟着一个符合条件的字符才会匹配,但你要匹配的FXLH_TestData本身就是完整目录名,后面没有额外字符,所以反而会匹配失败;而FXLH_TestData_manifest里的_刚好在字符类的排除列表里,也会匹配失败,完全和你的需求颠倒了。
正确的解决方案
根据你的需求(匹配\TestData\FXLH_TestData,排除\TestData\FXLH_TestData_manifest),给你两种可选方案:
方案1:允许目录名以XXX_TestData开头,仅排除后缀为_manifest的情况
适合如果还有XXX_TestData_abc这类目录也需要匹配的场景,正则用负向预测先行断言来精准排除特定后缀:
// 用@符号声明逐字字符串,避免转义符干扰 string dirReg = @"[A-Z]+_TestData(?!_manifest)"; foreach (string subDir in Directory.GetDirectories(targetDir)) { // 提取目录的最后一段名称,避免路径里的\干扰匹配逻辑 string dirName = Path.GetFileName(subDir); if (Regex.IsMatch(dirName, dirReg)) { // 这里处理符合条件的目录 Console.WriteLine("匹配成功:" + dirName); } }
(?!_manifest)的作用是:确保当前位置后面不会出现_manifest这个完整字符串,完美契合你的排除需求。
方案2:严格匹配完全等于XXX_TestData的目录名
如果只想要刚好是XXX_TestData格式的目录,用锚点限定字符串的开头和结尾,实现精确匹配:
string dirReg = @"^[A-Z]+_TestData$"; foreach (string subDir in Directory.GetDirectories(targetDir)) { string dirName = Path.GetFileName(subDir); if (Regex.IsMatch(dirName, dirReg)) { Console.WriteLine("严格匹配成功:" + dirName); } }
^表示字符串的起始位置,$表示结束位置,确保整个目录名就是「大写字母+_TestData」的格式,没有任何额外后缀。
新手小提示
在C#里写正则尽量用逐字字符串(加@前缀),避免因为转义符(比如\)导致的意外问题,这也是很多新手容易踩的坑哦。
内容的提问来源于stack exchange,提问作者Cagbuya
相关产品推荐
相关产品推荐

