2009-11-17 168 views
0

我有一堆需要解析的文件,它們都有文件名中的兩個日期模式之一(我們正在升級我們的系統,我們需要文件解析器是能夠識別兩種日期格式,新舊)。C#懶惰正則表達式匹配

的文件名看起來要麼<fileroot>_yyyyMMdd.log<fileroot>_MMddyy.log,我需要能夠然而,解析出的數字來解析日期,每當我試圖用正則表達式像^.*(\\d{6,8}).*$^.*(\\d{6}|\\d{8}).*$解析出的號碼日期,捕獲組的長度始終爲6個字符,即使是8位數的文件名也是如此。

有沒有什麼辦法強制C#中的正則表達式庫在嘗試匹配正則表達式時儘可能詳盡?我知道如何在Java中做到這一點,而不是C#/ .NET,我對這種語言很陌生。

回答

3

問題出在這裏:「。*」。正則表達式很貪婪,所以它匹配儘可能多的符號。包括兩個第一位數

解決方案:

1).*_(\\d{6,8}) - 如果你總是數字

2).*[^\\d](\\d{6,8})

3).*?(\\d{6,8})

之前有_你也有同樣的問題在Java中,正則表達式到處都是貪婪的。

+0

#1伎倆,非常感謝你的幫助。 – 2009-11-17 21:55:24

1

如果您知道的日期總是跟着一個已知的字符串,我會改變的正則表達式來迫使該字符串匹配:

^.*(\\d{6,8})\.log$ 

這將迫使正則表達式引擎消耗爲了所有8位以匹配尾隨\.log

+0

試過了,不起作用。 .NET正則表達式引擎(明顯默認)的惰性匹配與使用該正則表達式的fileroot_20091117.log進行比較時會得到'091117'。 – 2009-11-17 21:51:48