我有一堆需要解析的文件,它们都有文件名中的两种日期模式之一(我们正在升级我们的系统,我们需要让文件解析器能够识别这两个日期格式,新旧)。
文件名看起来像<fileroot>_yyyyMMdd.log
或<fileroot>_MMddyy.log
,我需要能够解析数字来解析日期,但是,每当我尝试使用像{{1这样的正则表达式时或^.*(\\d{6,8}).*$
解析日期的编号,捕获组的长度始终为6个字符,即使是8位数的文件名也是如此。
有没有办法强制C#中的正则表达式库在尝试匹配正则表达式时尽可能详尽?我知道怎么用Java做,只不是C#/ .NET,我对这门语言很新。
答案 0 :(得分:3)
问题在于:“。*”。正则表达式是贪婪的,所以它匹配尽可能多的符号。包括两个第一位数
解决方案:
1).*_(\\d{6,8})
- 如果您在数字之前总是_
2).*[^\\d](\\d{6,8})
3).*?(\\d{6,8})
你在Java中会遇到同样的问题,Regex到处都是贪婪的。
答案 1 :(得分:1)
如果您知道日期后面跟着一个已知的字符串,我会更改正则表达式以强制匹配该字符串:
^.*(\\d{6,8})\.log$
这将强制正则表达式引擎使用全部8位数字以匹配尾随\.log
。