2011-08-22 58 views
0

我發現RichTextBox和RegEx的組合存在一個奇怪的問題。 如果我的文本文件加載到一個RichTextBox和使用如果文本沒有從RichTextBox中讀取,RegEx會變慢

Dim matches As MatchCollection = Regex.Matches(RichTextBox1.Text, "^H(.+\t){10}\n", RegexOptions.Multiline Or RegexOptions.IgnoreCase) 

那麼正則表達式將運行速度極快。 如果我從一個文件中的文本直接加載到一個字符串,並使用

Dim FullText As String = New StreamReader("c:\Temp\TextFile.txt", System.Text.Encoding.UTF8, True).ReadToEnd 
Dim matches As MatchCollection = Regex.Matches(FullText, "^H(.+\t){10}\n", RegexOptions.Multiline Or RegexOptions.IgnoreCase) 

然後將正則表達式的年齡運行養活這個字符串RegEx.Matches OTOH。

現在顯然RichTextBox對文本做了些什麼。我發現將文本加載到RichTextBox中將消除文本的前4個字節(即字節順序標記?)。但是,使用SubString修剪這4個字符不會解決問題。 RichTextBox做了一些我不知道的其他處理。

我使用正則表達式的客戶端和服務器端上(客戶端可以將文本文件加載到一個RichTextBox測試和設置各種正則表達式的,服務器會根據這些先前設置的正則表達式的處理文本文件)。不用說,正則表達式會在加載到RichTextBox的文本文件中快速運行,而完全相同的RegEx運行完全相同的文本文件似乎會鎖定服務器端服務。

我的問題:RichTextBox執行什麼類型的文本處理,以及如何模仿服務器端進程中的行爲?

感謝您提前給予的幫助。

最好的問候, 丹尼爾

回答

0

只是猜測:

  1. 計測時間,你數到加載從磁盤上的文件的時間?加載文件的時間可能比運行正則表達式的時間要長。

  2. 也許它與Unicode有關?也許RichTextBox中的字符串表示比處理變量中的字符串更快嗎?你可以通過使用BinaryFormatter來將它們輸出到一個字節列表來測試它,看看這些字節是否相同。

+0

感謝您的回覆。我遍歷調試器中的代碼。問題中的文本文件是1800字節,因此不需要加載時間。調試器立即跳轉到下一行。但是,在讀出MatchCollection.Count(即實際處理正則表達式的時間)時,大約需要3-4分鐘才能完成。所以差異是相當明顯的。我會看看BinaryFormatter。 – Daniel

+1

事實證明,RichTextBox將\ r \ n轉換爲\ n。一旦對字符串進行轉換,一切正常。 – Daniel

相關問題