C#懒惰正则表达式匹配

时间:2009-11-17 21:35:24

标签: c# regex regex-greedy

我有一堆需要解析的文件,它们都有文件名中的两种日期模式之一(我们正在升级我们的系统,我们需要让文件解析器能够识别这两个日期格式,新旧)。

文件名看起来像<fileroot>_yyyyMMdd.log<fileroot>_MMddyy.log,我需要能够解析数字来解析日期,但是,每当我尝试使用像{{1这样的正则表达式时或^.*(\\d{6,8}).*$解析日期的编号,捕获组的长度始终为6个字符,即使是8位数的文件名也是如此。

有没有办法强制C#中的正则表达式库在尝试匹配正则表达式时尽可能详尽?我知道怎么用Java做,只不是C#/ .NET,我对这门语言很新。

2 个答案:

答案 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