如何用C#检测文件名是否为哈希值?正则表达式问题排查
解决C#中检测哈希格式文件名的问题
我来帮你搞定这个问题!你当前的代码只能匹配32位无连字符的十六进制哈希,但你的目标哈希文件名是带连字符分隔的20组两位十六进制字符,所以正则不匹配很正常。咱们来修改代码,同时支持两种常见的哈希文件名格式:
步骤1:先处理文件名(去掉扩展名)
首先要把文件名的扩展名(比如.zip)去掉,只检查文件名的主体部分是否为哈希格式,避免扩展名干扰判断。
步骤2:更新正则表达式
新的正则需要同时匹配两种情况:
- 带连字符的格式:20组两位十六进制字符,每组用
-分隔(比如你提供的98-80-7D-E5-50-A1-73-59-7F-FC-1C-CB-10-0F-39-D7-C2-97-88-44) - 无连字符的格式:32位连续十六进制字符(你原来的逻辑)
修改后的完整代码
using System.IO; using System.Text.RegularExpressions; private static bool IsFileHash(string input) { if (string.IsNullOrEmpty(input)) return false; // 提取不带扩展名的文件名主体 string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(input); // 正则匹配两种哈希格式:带连字符的20组两位十六进制,或32位无连字符十六进制 string hashPattern = @"^([0-9a-fA-F]{2}-){19}[0-9a-fA-F]{2}$|^[0-9a-fA-F]{32}$"; // 启用忽略大小写,让匹配更灵活(支持大写/小写十六进制字符) return Regex.IsMatch(fileNameWithoutExtension, hashPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); }
测试验证
- 输入
98-80-7D-E5-50-A1-73-59-7F-FC-1C-CB-10-0F-39-D7-C2-97-88-44.zip→ 返回true - 输入
model.zip→ 返回false - 输入
a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4.zip(32位无连字符哈希)→ 返回true
内容的提问来源于stack exchange,提问作者Jay Nanavaty
相关产品推荐
相关产品推荐

