2008-09-11 108 views
6

我們已經有了一個需要我們解析大量電子郵件(純文本)的場景,每個電子郵件「類型」是腳本在各種平臺上運行的結果。有些是製表符分隔的,有些是空格分隔的,有些我們還不知道。解析字符串的最佳方式是什麼?

我們還需要在未來支持更多'格式'。

我們怎樣去使用的解決方案:

  • 正則表達式
  • 簡單的字符串搜索(使用string.IndexOf等)
  • 萊克斯/ Yacc的
  • 其他

整體解決方案將在C#2.0中開發(希望是3.5)

回答

4

您陳述的三種解決方案都涵蓋了非常不同的需求。

手動解析(簡單文本搜索)是最靈活和最具適應性的,然而,它很快就成爲一個真正的麻煩,因爲解析需要更復雜。

Regex是一箇中間立場,可能是你最好的選擇。它們功能強大而靈活,因爲您可以從調用不同正則表達式的代碼中添加更多邏輯。主要缺點是速度在這裏。

Lex/Yacc實際上僅適用於非常複雜,可預測的語法,並且缺少很多後編譯靈活性。在解析中,你不能輕易改變解析器,實際上你可以,但它太重了,你最好用正則表達式代替。我知道這是一個陳詞濫調答案,這一切都真正歸結爲你的確切需求,但從你所說的,我個人可能會帶着一袋正則表達式。

作爲替代,作爲Vaibhav的poionted了,如果你有幾種不同的情況可能出現,並且您CNA很容易地檢測哪一個來了,你能做出選擇正確的算法插件系統,並且這些算法可能都非常不同,一個在尖銳的情況下使用Lex/Yacc,另一個在簡單的情況下使用IndexOf和正則表達式。

5

正則表達式。

正則表達式可以解決幾乎所有的問題,除了世界和平。或許世界和平也是。

+1

我聽說Regex負責灌溉柏林牆。 – 2008-09-11 11:53:11

+0

他們確實應該停止在災難片中使用Nukes。 – Coincoin 2008-09-11 12:19:28

0

正則表達式可能是你bes打賭,嘗試和證明。另外還可以編譯一個正則表達式。

1

無論使用哪種類型的字符串解析,您可能都應該有一個可插入的系統。所以,這個系統根據電子郵件的類型調用正確的「插件」來解析它。

-1

由於您提供的信息很少,我會選擇正則表達式。

但是你要分析,你願意這樣做會改變決定萊克斯/ Yacc的可能是什麼什麼樣的信息..

但它看起來像你已經做了你的心了字符串搜索:)

0

最好的選擇是RegEx,因爲它提供了比其他選項更大程度的靈活性。

雖然你可以使用IndexOf處理出頭,你可能會很快發現自己寫的代碼看起來像:

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

可以在一個正則表達式語句來處理。此外,還有很多地方,如RegExLib.com,您可以找到共享正則表達式來解決問題的人。

1

您必須將您的解決方案設計爲可更新,以便在出現問題時處理未知情況。爲解析器創建接口,不僅包含解析電子郵件和以標準格式返回結果的方法,還包含檢查電子郵件以確定解析器是否將執行的方法。

在您的配置中,確定您希望使用的解析器的類型,設置其配置選項以及確定解析器是否會動作的標識符的配置。通過程序集限定名命名解析器,以便在運行時可以實例化類型,即使沒有靜態鏈接到它們的程序集也是如此。

標識符也可以實現一個接口,因此您可以創建檢查不同事物的不同類型。例如,您可以創建一個正則表達式標識符,用於解析特定模式的電子郵件。確保爲標識符提供儘可能多的信息,以便它可以根據地址和電子郵件的內容來做出決定。

當您的已知解析器無法處理作業時,請創建一個新的DLL,其中包含實現解析器和標識符接口的類型,這些類型可以處理作業並將其放入bin目錄中。

1

這取決於你解析的內容。對於Regex無法處理的任何內容,我一直在使用ANTLR。在第一次進入遞歸下降解析之前,我會研究它們是如何工作的,然後再嘗試使用像這樣的框架。如果您訂閱MSDN Magazine,請查看2008年2月刊,他們有一篇關於從頭開始撰寫文章的文章。

一旦你理解了,學習ANTLR將會變得更容易。還有其他框架,但ANTLR似乎擁有最多的社區支持和公共文檔。作者還發布了The Definitive ANTLR Reference: Building Domain-Specific Languages

0

@Coincoin已經涵蓋了基地;我只是想用正則表達式來添加它,特別容易導致難以閱讀,難以維護的代碼。正則表達式是一種功能強大且非常緊湊的語言,所以這就是它經常發生的事情。

在正則表達式中使用空格和註釋可以使維護正則表達式變得更加容易。 Eric Gunnerson把我轉到了這個想法。這是an example

0

使用PCRE。所有其他答案只是第二好的。

相關問題