2011-03-07 94 views
2

我想一類是這樣的:識別日期字符串中的

public interface IDateRecognizer 
{ 
    DateTime[] Recognize(string s); 
} 

的日期可能存在的任何地方字符串中,可能是任何格式。目前,我可以限制美國的文化格式。日期不會以任何方式分隔。它們可能在日期的各個部分之間有任意數量的空白。我的想法是:

  • ANTLR
  • 正則表達式
  • 手卷

我從來沒有使用ANTLR,所以我會從頭開始學習。我想知道是否有類似的庫或代碼示例可以啓動我。 ANTLR對於如此狹窄的用途來說太重了嗎?

我以前用過Regex很多,但是我討厭它,因爲大多數人都討厭它。

我當然可以滾動它,但我寧願不重新解決一個解決的問題。

對此提出建議?

UPDATE:這裏是一個例子。給定此輸入:

這是日期11/3/63。這是 另一個:1963年11月3日;和另一個11月03日,63日和一些 更多(11/03/1963) 。日期可以是任何美國格式的 。他們可能有 破折號像1963年11月2日或怪異的額外 空格內是這樣的: 月      3,      1963年, 甚至也許逗號缺失 像[63年11月3日],但是這是一個邊緣 的情況。

輸出應該是一個由七個DateTime組成的數組。每個日期都是一樣的:11/03/1963 00:00:00。

UPDATE:我完全手卷了這個,我很滿意這個結果。我沒有使用Regex,而是使用DateTime.TryParse和一個自定義的DateTimeFormatInfo,它可以非常容易地調整允許的格式和2位數年份的處理方式。考慮到這是異步處理,性能是完全可以接受的。棘手的部分是以有效的方式標記和測試相鄰令牌的集合。

回答

4

我會去一些手滾解決方案將輸入字符串切成可管理的大小,讓一些正則表達式來完成這項工作。這對於單元測試來說似乎是一個很好的測試。

+0

+1單元測試建議 –

0

對於正則表達式來說,識別日期似乎是一個簡單易行的任務。我不明白你爲什麼試圖避免它。

對於這種情況下ANTLR你有一套非常有限的語義只是矯枉過正。

雖然性能可能是一個潛在的問題,但我真的懷疑,如果其他選項會給你更好的表現。所以我會去Regex

+0

任何建議如何開始?我希望能夠處理如下字符串:「這是一個日期11/3/09和另一個2010年9月18日,另一個是99年9月2日和更多日期01/01/1966在任何美國格式1月33日,2010裏面有奇怪的額外空白,甚至可能是逗號像10月3日99一樣缺失。所以我想用6個日期返回DateTime []。 –

+0

更新你的問題,並帶來一個你想到的日期列表,我們將建議正則表達式模式。很明顯,需要定義處理變體的任何要求,以便它可以添加到正則表達式中。 – Aliostad

+0

已更新。感謝Aliostad。 –

1

我建議你去正則表達式。我將一個正則表達式(匹配一個日期)放入一個字符串中,並將其中的多個放入一個數組中。然後在運行時創建完整的正則表達式。這使得系統更加靈活。根據需要,可以考慮將不同的date-regex放入(XML)文件/ db中。

相關問題