RegEx замедляется, если текст не читается из RichTextBox - PullRequest
0 голосов
/ 22 августа 2011

Я обнаружил странную проблему с комбинацией RichTextBox и RegEx.Если я загружу текстовый файл в RichTextBox и использую

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

, то RegEx будет работать очень быстро.OTOH, если я загружаю текст из файла прямо в строку и кормлю эту строку с помощью RegEx.Matches, используя

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)

, тогда регулярное выражение будет работать целую вечность.

Теперь, очевидно, RichTextBox делаетчто-то к тексту.Я обнаружил, что загрузка текста в RichTextBox устранит первые 4 байта текста (это знак порядка байтов?).Однако обрезка этих 4 символов с помощью SubString не решит проблему.RichTextBox выполняет некоторую другую обработку, о которой я не знаю.

Я использую RegEx как на стороне клиента, так и на стороне сервера (клиент может загружать текстовые файлы в RichTextBox для тестирования и настройки различных RegEx, и сервер будет обрабатывать текстфайлы в соответствии с этими ранее настройками RegEx).Само собой разумеется, что регулярное выражение будет работать с огромной скоростью для текстового файла, загруженного в RichTextBox, в то время как тот же RegEx, запускаемый через тот же текстовый файл, может заблокировать службу на стороне сервера.

Мой вопрос:какой вид обработки текста выполняет RichTextBox и как я могу имитировать поведение в процессе на стороне сервера?

Заранее благодарю за любезную помощь.

С наилучшими пожеланиями, Даниэль

1 Ответ

0 голосов
/ 22 августа 2011

Только предположения:

  1. Для измерения времени считаете ли вы время загрузки файла с диска?Время загрузки файла может быть больше, чем время запуска регулярного выражения.

  2. Может, это как-то связано с Юникодом?Может быть, представление строки в RichTextBox как-то быстрее обрабатывается, чем в переменной?Вы можете проверить это с помощью BinaryFormatter для вывода каждого из них в список байтов и посмотреть, совпадают ли байты.

...