Почему это регулярное выражение быстрее?

голоса
15

Я пишу клиент Telnet сортов в C # и часть того , что я должен разобрать являются ANSI / VT100 экранирующих последовательности, в частности, только те , которые используются для цвета и форматирования (подробно здесь ).

Один из методов, у меня есть один, чтобы найти все коды и удалить их, так что я могу вынести текст без какого-либо форматирования, если это необходимо:

    
public static string StripStringFormating(string formattedString)
{
    if (rTest.IsMatch(formattedString))
        return rTest.Replace(formattedString, string.Empty);
    else
        return formattedString;
}

Я новичок в регулярных выражениях, и я предложил использовать это:

static Regex rText = new Regex(@\e\[[\d;]+m, RegexOptions.Compiled);

Тем не менее, это не удалось, если код побег был неполным из-за ошибки на сервере. Итак это было предложено, но мой друг предупредил, что это может быть медленнее (это один также соответствует еще одно условие (г), что я мог бы встретить позже):

static Regex rTest = 
              new Regex(@(\e(\[([\d;]*[mz]?))?)?, RegexOptions.Compiled);

Это не только работал, но на самом деле быстрее и уменьшить влияние на мой визуализации текста. Может кто-нибудь объяснить регулярное выражение новичок, почему? :)

Задан 07/08/2008 в 16:43
источник пользователем
На других языках...                            


4 ответов

голоса
3

Вы действительно хотите сделать запустить регулярное выражение дважды? Без проверив (плохо меня) я бы подумал, что это будет хорошо работать:

public static string StripStringFormating(string formattedString)
{    
    return rTest.Replace(formattedString, string.Empty);
}

Если это произойдет, вы должны увидеть его запустить ~ в два раза быстрее ...

Ответил 09/09/2008 в 22:36
источник пользователем

голоса
3

Причина , почему # 1 происходит медленнее , является то , что [\ д;] + является жадным квантором. Использование +? или *? собирается делать ленивый quantifing. Смотрите MSDN - Кванторы для получения дополнительной информации.

Вы можете попробовать:

"(\e\[(\d{1,2};)*?[mz]?)?"

Это может быть быстрее для вас.

Ответил 07/08/2008 в 17:24
источник пользователем

голоса
1

Я не уверен, если это поможет с тем, что вы работаете, но давно я написал регулярное выражение для разбора ANSI графических файлов.

(?s)(?:\e\[(?:(\d+);?)*([A-Za-z])(.*?))(?=\e\[|\z)

Она возвращает каждый код и текст, связанный с ним.

Строка ввода:

<ESC>[1;32mThis is bright green.<ESC>[0m This is the default color.

Результаты:

[ [1, 32], m, This is bright green.]
[0, m, This is the default color.]
Ответил 17/09/2008 в 16:31
источник пользователем

голоса
1

Не делая детальный анализ, я думаю, что это быстрее из вопросительных знаков. Они позволяют регулярное выражение, чтобы быть «ленивым» и остановиться, как только у них достаточно, чтобы соответствовать, а не проверка, если остальная часть входа совпадает.

Я не совсем доволен этим ответом, хотя, потому что это в основном относится к вопросительными знаками после * или +. Если бы я был более знаком с входом, это может сделать больше смысла для меня.

(Кроме того , для форматирования коды, вы можете выбрать все ваш код и нажмите Ctrl+ , Kчтобы он добавить четыре пространства требуется.)

Ответил 07/08/2008 в 16:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more