2011-09-14 74 views
2

我有一個正則表達式匹配日期格式,如:26 August 2011 我試圖讀取文件中的每一行並捕獲包含上述格式的日期的行。但它似乎並不奏效:搜索文件內容的正則表達式匹配

Regex test = new Regex(@"^((31(?!\ (Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?!\ Feb(ruary)?))|(29(?=\ Feb(ruary)?\ (((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])\ (Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)\ ((1[6-9]|[2-9]\d)\d{2})$"); 
StreamReader file = new StreamReader(outputFile); 

while ((line2 = file.ReadLine()) != null) 
{ 
    lines.Add(line2); 
    foreach (Match match in test.Matches(line2)) 
    { 
     v += match.Value; 
    } 
} 

好了,所以這是該方案..
月1日 - 如果行包含:「2011年8月26」,它返回日期。
2nd - 如果行包含:「一些文本等2011年8月26日」,則返回null。

任何想法如何解決這個問題?

+1

通過給'test'一個更合適的值呢? – Jon

+0

我已經添加了正則表達式測試。 –

+2

我真的很喜歡Regex是多麼直觀。 – jim

回答

3

正則表達式中的前導字符^表示「匹配從行首開始匹配」。最後一個字符是$,這意味着該行必須以表達式結束。因此,如果您的行包含指定格式的日期以外的任何內容,則正則表達式不會匹配。

刪除前面的^,最後刪除$

+0

謝謝吉姆。這工作完美。我想這是我的錯誤,因爲我只是從另一個網站複製並粘貼它,而沒有任何關於它的工作方式的想法。同樣,如果有人有正則表達式:dd-MMM-yy和2011年8月26日,我將不勝感激。謝謝 –

0

我猜測試定義爲Regex test=new Regex("26 August 2011");

試試這個

StreamReader file = new StreamReader(outputFile); 

while ((line2 = file.ReadLine()) != null) 
{ 
    lines.Add(line2); 
    if (test.IsMatch(line2)) 
    { 
     v += line2; 
    } 
} 

儘管你可能想使用StringBuilder的性能(例如v = new StringBuilder()),然後代替v += line2你做v.Append(line2)

--UPDATE

閱讀更新後的使用提供的正則表達式,如果你只是使用你現有的代碼,並在最後刪除^開始和$在最後,那麼你的代碼將找到文件中的所有日期,無論位置如果這是你在之後。

+0

嘗試dat,它返回每一行。 –

+0

有什麼辦法可以只返回日期並放棄該行中的所有其他文本? –

+0

你究竟想要匹配什麼?您是否試圖查找所有隻包含日期的行,或者您是否嘗試匹配可以包含其他文本的行內的日期? –