Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Регулярное выражение от =begin до опционального =end

#c_sharp #регулярные_выражения


Нужно составить регулярное выражение возвращающее текст от =begin и до =end, причем
если =end отсутствует, то нужно вернуть весь текст после =begin до конца richTextBox (C#). 
    


Ответы

Ответ 1



var str = "text =begin ..."; var m = Regex.Match(str, "=begin(.+?)(=end|$)", RegexOptions.Singleline); m.Groups[1].Value; // " ..."

Ответ 2



Использование ленивого квантификатора с точкой чревато выраженным замедлением работы программы в случае, если в тексте присутствует начальный разделитель, за которым следует большой кусок текста, после которого нет конечного разделителя. Чтобы избежать таких проблем, рекомендуется использовать развернутый ленивый квантификатор (unroll-the-loop technique). Для данного случая, нам нужно сначала найти =begin, а потом любой текст, не начинающий собой последовательность =end: =begin([^=]*(?:=(?!end)[^=]*)*) ^^^^^^^^^^^^^^^^^^^^^^^^ Объяснение: =begin - буквальная последовательность =begin ([^=]*(?:=(?!end)[^=]*)*) - захватывающая подмаска №1, которая находит 0 и более символов, отличных от = ([^=]*), за которой следует 0 и более последовательностей знака =, после которого нет end (см. =(?!end)), а после этого снова следует 0 и более символов, отличных от =. Сравнение на сайте regexhero.net (строка в тесте тут): =begin([^=]*(?:=(?!end)[^=]*)*) (2551 и/с) быстрее =begin(.+?)(=end|$) (53 и/с) в ~46 раз! Код для получения всех вхождений (даже не надо использовать RegexOptions.Singleline): var str = "My string with =begin...=end ... =begin..."; var results = Regex.Matches(str, "=begin([^=]*(?:=(?!end)[^=]*)*)") .Cast() .Select(p => p.Groups[1].Value) .ToList();

Комментариев нет:

Отправить комментарий