正则表达式提取不含日期的文件名及扩展名遇异常求解决方案
解决方案
原代码问题分析
你用的正则\D+\S\D+逻辑太模糊,它只是匹配「至少一个非数字+任意非空白字符+至少一个非数字」,完全没法区分日期和文件名的边界,所以会出现丢扩展名、匹配到多余下划线的问题。
改进方案
首先明确文件名里日期的常见格式(比如20240520、2024-05-20、2024.05.20),通常日期要么是前缀(如20240520_report.pdf)要么是后缀(如report_20240520.pdf)。下面提供两种可靠的实现方式:
方式1:用正则替换移除日期部分
这种方式更简洁,直接把文件名里的日期相关片段删掉,剩下的就是纯文件名+扩展名:
public override void Input0_ProcessInputRow(Input0Buffer Row) { string fullFileName = Row.fullfilename; // 匹配常见的日期前缀/后缀格式,包含分隔符 string datePattern = @"(?:^\d{8}_|^\d{4}[-.]\d{2}[-.]\d{2}_|_(\d{8}|\d{4}[-.]\d{2}[-.]\d{2}))(?=\.\w+$|$)"; // 移除匹配到的日期片段 string cleanFileName = Regex.Replace(fullFileName, datePattern, string.Empty); // 处理极端情况(比如原文件名只有日期,不过这种情况很少见) Row.filename = string.IsNullOrWhiteSpace(cleanFileName) ? " " : cleanFileName; }
正则各部分说明:
^\d{8}_:匹配开头的8位数字日期+下划线(如20240520_)^\d{4}[-.]\d{2}[-.]\d{2}_:匹配开头的带分隔符日期+下划线(如2024-05-20_、2024.05.20_)_(\d{8}|\d{4}[-.]\d{2}[-.]\d{2}):匹配下划线+日期后缀(如_20240520、_2024-05-20)(?=\.\w+$|$):确保日期后面是扩展名或文件名结尾,避免误删文件名里的正常数字(比如file123.pdf里的123)
方式2:用捕获组直接提取目标内容
如果需要更明确的逻辑分支,可以用捕获组分别匹配不同结构的文件名:
public override void Input0_ProcessInputRow(Input0Buffer Row) { string fullFileName = Row.fullfilename; // 匹配三种情况:日期在前、日期在后、无日期 string pattern = @"^(?:\d{8}|\d{4}[-.]\d{2}[-.]\d{2})_(.*)$|^(.*)_(?:\d{8}|\d{4}[-.]\d{2}[-.]\d{2})(\.\w+)$|^(.*\.\w+)$"; Match match = Regex.Match(fullFileName, pattern); if (match.Success) { // 依次检查各个捕获组的内容 string result = match.Groups[1].Value; if (string.IsNullOrEmpty(result)) result = match.Groups[2].Value + match.Groups[3].Value; if (string.IsNullOrEmpty(result)) result = match.Groups[4].Value; Row.filename = string.IsNullOrWhiteSpace(result) ? " " : result; } else { Row.filename = " "; } }
注意事项
如果你的日期格式和上述示例不同(比如是6位的MMDDYY),只需要调整正则里的日期匹配部分即可,比如把\d{8}改成\d{6}。
内容的提问来源于stack exchange,提问作者neeraj
相关产品推荐
相关产品推荐

