C#正则表达式匹配文件名效果不稳定,如何排查问题并优化?
问题原因
- 滥用字符类(方括号
[]):方括号的作用是匹配其中的任意单个字符,你原本写的[jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec]实际会匹配j、a、n、|、f等单个字符,完全达不到匹配3位月份缩写的效果;同理后缀部分的[comp|disk|scs]也是字符类,不是匹配整个完整单词。 - 日期匹配规则错误:你写的
(?:2?[0-3]{2}|1?[0-9])无法匹配合法的1-31日,会出现233、00这类完全不符合日期规则的结果。 - 后缀匹配逻辑错误:
([comp|disk|scs]){4}要求从字符集中取4个字符,虽然后缀为3位的scs会被排除,但逻辑完全不符合设计预期,也会出现co|p这类非法后缀被误匹配的问题。
优化后的实现方案
修正后的C#正则如下:
@"^t4_(?:[a-zA-Z]{5}[0-9])_(?:0[1-9]|[12][0-9]|3[01])(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[0-9]{4}_[0-9]{4}_[0-9]{4}_(?:comp|disk)\b"
该正则完全匹配你给出的规则:
- 非
t4开头的文件(如TraceLog_somename_other.log):不匹配 - 后缀为
comp、disk的符合规则文件:匹配 - 后缀为
scs的文件:不符合后缀规则,不匹配 - 日期、月份不符合规范的文件名:不匹配
如果需要捕获前缀、时间分段等内容,可自行给对应分段添加捕获括号即可。
内容的提问来源于stack exchange,提问作者Tim P
相关产品推荐
相关产品推荐

