SlideShare uma empresa Scribd logo
1 de 9
Baixar para ler offline
Регулярные выражения
1 ОПРЕДЕЛЕНИ ОПРЕДЕЛЕНИЕ
Регулярное выражение описывает одну или несколько строк, по которым выполняется
сопоставление при поиске в тексте. Такое выражение служит в качестве шаблона для сравнения с
текстом, в котором выполняется поиск. Регулярные выражения можно использовать для поиска
шаблонов в строке, замены текста и извлечения подстрок.
Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для
поиска и подстановки текста. Например, при помощи регулярных выражений можно задать
шаблоны, позволяющие:
 найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета»,
«терракотовый»;
 найти отдельно стоящее слово «кот» и заменить его на «кошка»;
 найти слово «кот», которому предшествует слово «персидский» или «чеширский»;
 убрать из текста все предложения, в которых упоминается слово кот или кошка.
В ISO-C++ нет стандартной поддержки регулярных выражений. Поддержка добавляется
подключением библиотек
 boost.
 В С++ в TR1 есть cpp_regex, а в самый последних компиляторах в std::regex
 poco
 pcre.
2 СИНТАКСИС
ОБЫЧНЫЕ И СПЕЦИАЛЬНЫЕ СИМВОЛЫ (МЕТАСИМВОЛЫ)
Большинство символов в регулярном выражении представляют сами себя за исключением
специальных символов [ ]  / ^ $ . | ? * + ( ) { }, которые могут быть предварены символом  (обратная
косая черта) («экранированы», «защищены») для представления их самих в качестве символов
текста. Можно экранировать целую последовательность символов, заключив её между Q и E.
Аналогично могут быть представлены другие специальные
символы (набор символов, требующих экранирования, может
отличаться в зависимости от конкретной реализации). Часть
символов, которые в той или иной реализации не требуют
экранирования (например, угловые скобки < >), могут быть
экранированы из соображений удобочитаемости.
Метасимвол . (точка) означает один любой символ, но в некоторых реализациях исключая
символ новой строки.
СИМВОЛЬНЫЕ КЛАССЫ (НАБОРЫ СИМВОЛОВ)
Набор символов в квадратных скобках [ ] именуется символьным классом и позволяет указать
интерпретатору регулярных выражений, что на данном месте в строке может стоять один из
перечисленных символов. В частности, [абв] задаёт возможность появления в тексте одного из трёх
указанных символов, а [1234567890] задаёт соответствие одной из цифр. Возможно указание
диапазонов символов: например, [А-Яа-я] соответствует всем буквам русского алфавита, за
исключением букв «Ё» и «ё».
Если требуется указать символы, которые не входят в указанный набор, то используют символ ^
внутри квадратных скобок, например [^0-9] означает любой символ, кроме цифр.
Некоторые символьные классы можно заменить специальными метасимволами:
ПОЗИЦИЯ ВНУТРИ СТРОКИ
Следующие символы позволяют спозиционировать регулярное выражение относительно
элементов текста: начала и конца строки, границ слова.
КВАНТИФИКАЦИЯ (ПОИСК ПОСЛЕДОВАТЕЛЬНОСТЕЙ)
Квантификатор после символа, символьного класса или группы определяет, сколько раз
предшествующее выражение может встречаться. Следует учитывать, что квантификатор может
относиться более чем к одному символу в регулярном выражении, только если это символьный
класс или группа.
Ква́нтор — общее название для логических операций, ограничивающих область истинности
какого-либо предиката и создающих высказывание.
Часто используется последовательность .* для обозначения любого количества любых символов
между двумя частями регулярного выражения.
Если символы { } не образуют квантификатор, их специальное значение игнорируется.
УПРАВЛЯЮЩИЕ СИМВОЛЫ
ОБОЗНАЧЕНИЕ ГРУППЫ
Круглые скобки используются для определения области действия и приоритета операций. Шаблон
внутри группы обрабатывается как единое целое и может быть квантифицирован. Например,
выражение (тр[ау]м-?)* найдёт последовательность вида трам-трам-трумтрам-трум-трамтрум.
МОДИФИКАТОРЫ
Модификаторы действуют с момента вхождения и до конца регулярного выражения или
противоположного модификатора. Некоторые интерпретаторы могут применить модификатор ко
всему выражению, а не с момента его вхождения.
Группы-модификаторы можно объединять в одну группу: (?i-sm). Такая группа включает режим i и
выключает режим s, m. Если использование модификаторов требуется только в пределах группы,
то нужный шаблон указывается внутри группы после модификаторов но перед двоеточием.
Например, (?-i)(?i:tv)set найдёт TVset, но не TVSET.
ПЕРЕЧИСЛЕНИЕ
Вертикальная черта разделяет допустимые варианты. Например, gray|grey соответствует gray или
grey. Следует помнить, что перебор вариантов выполняется слева направо, как они указаны.
Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его
нужно заключить в группу. Например, gray|grey или gr(a|e)y описывают строку gray или grey. В
случае с односимвольными альтернативами предпочтителен вариант gr[ae]y, так как сравнение с
символьным классом выполняется проще, чем обработка группы с проверкой на все её
возможные модификаторы и генерацией обратной связи.
ПРОСМОТР ВПЕРЁД И НАЗАД
В большинстве реализаций регулярных выражений есть способ производить поиск фрагмента
текста, «просматривая» (но не включая в найденное) окружающий текст, который расположен до
или после искомого фрагмента текста. Например, таким способом легко найти имя тега HTML, не
включая в результат поиска окружающие его угловые скобки или другие знаки, но и не упуская их
«из внимания» при поиске нужного контекста. Просмотр с отрицанием используется реже и
«следит» за тем, чтобы указанные соответствия, напротив, не встречались до или после искомого
текстового фрагмента.
ПОИСК ПО УСЛОВИЮ
Во многих реализациях регулярных выражений существует возможность выбирать, по какому пути
пойдёт проверка в том или ином месте регулярного выражения на основании уже найденных
значений.
3 ИСПОЛЬЗОВАНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ В C++ 11
Для использования регулярных выражений в C++ необходимо подключить стандартную
библиотеку regex. Основные функции для работы содержатся в пространстве имен std.
Функциями, используемыми для применения регулярных выражений являются:
 regex_match – проверяет соответствие всей последовательности символов
регулярному выражению
 regex_search – проверяет регулярное выражение в любой части
последовательности
 regex_replace – заменяет найденный символы, найденные регулярным
выражением форматированной строкой.
REGEX_MATCH
Функция regex_match проверяет всю строку на соответствие регулярному выражению, и
возвращает true, если они совпадают.
Regex_match имеет множество прототипов, одним из вариантов использования является данный
прототип
template <class ST, class SA, char charT, class traits>
bool regex_match (const basic_string<charT,ST,SA>& s, const basic_regex<charT,traits>& rgx,
regex_constants::match_flag_type flags = regex_constants::match_default);
Пояснение
 Первый аргумент – строка типа string, в которой будем производить поиск
 Второй аргумент – объект класса regex, в котором записано регулярное выражение
 Третий аргумент – необязательное поле для флагов
Например, эту функцию можно записать так:
std::string s ("1");
std::regex e ("[[:digit:]]"");
bool search = std::regex_match (s,e);
Пример:
Напишем программу, которая будет проверять, записано в строке целое число, или любой другой
набор символов.
Регулярным выражением для поиска числа будет данное выражение ("-?[[:digit:]]+")
-? – говорит о том, что первым символом может быть минус
[[:digit:]] – будем искать исключительно числовые символы (0-9)
+ – это значит, что числовых символов может быть больше одного
Тогда программа будет иметь такой вид:
REGEX_SEARCH
Данная функция работает аналогично функции regex_search, с тем отличием, что тут проверяется не полное
соответствие строки регулярному выражению, true будет возвращено и при частичном совпадении. Прототип
функции совпадает с предыдущим примером.
template <class ST, class SA, char charT, class traits>
bool regex_search (const basic_string<charT,ST,SA>& s, const basic_regex<charT,traits>& rgx,
regex_constants::match_flag_type flags = regex_constants::match_default);
Пример:
Эта программа будет искать все слова с частью “ello”. Регулярное выражение
будет очень простым, и иметь вид “ello”
REGEX_REPLACE
Функция regex_replace производит поиск поиск в строке по заданному регулярному выражению и
производит замену найденных значений на заданную строку. Прототип функции имеет вид:
template <class traits, class charT, class ST, class SA>
basic_string<charT> regex_replace (const charT*s,const basic_regex<charT,traits>& rgx, const
basic_string<charT,ST,SA>& fmt, regex_constants::match_flag_type flags = regex_constants::match_default);
 Первый аргумент – строка типа string, в которой будем производить поиск
 Второй аргумент – объект класса regex, в котором записано регулярное выражение
 Третий аргумент – строка типа string, в которая будет замещать найденные значения
 Четвертый аргумент - необязательное поле для флагов
Пример записи функции:
regex_replace(input_string, regular_expression, replace_string);
Пример:
Напишем программу, которая будет заменять слово “world” в исходной строке на слово “planet”.
Регулярное выражение будет иметь вид “world”.

Mais conteúdo relacionado

Mais procurados

Alterações cromossomiais
Alterações cromossomiaisAlterações cromossomiais
Alterações cromossomiaisDalu Barreto
 
NR_18_maquinas_equipamentos.pdf
NR_18_maquinas_equipamentos.pdfNR_18_maquinas_equipamentos.pdf
NR_18_maquinas_equipamentos.pdfMauro Kowalczuk
 
Treinamento-uso da betoneira
 Treinamento-uso da betoneira Treinamento-uso da betoneira
Treinamento-uso da betoneiraelianea
 
Modelo ficha de registro do diálogo diário de segurança (dds) - blog segura...
Modelo   ficha de registro do diálogo diário de segurança (dds) - blog segura...Modelo   ficha de registro do diálogo diário de segurança (dds) - blog segura...
Modelo ficha de registro do diálogo diário de segurança (dds) - blog segura...Dayvd Ebonys
 
Pp2 les possessifs
Pp2   les possessifsPp2   les possessifs
Pp2 les possessifsLúcia Cruz
 
[Bs 8800]-british standard-8800-1996[1]
[Bs 8800]-british standard-8800-1996[1][Bs 8800]-british standard-8800-1996[1]
[Bs 8800]-british standard-8800-1996[1]Aline Lima Tst
 
HERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICA
HERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICAHERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICA
HERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICALuiz Carlos
 
Procedimento de montagem elétrica
Procedimento de  montagem elétricaProcedimento de  montagem elétrica
Procedimento de montagem elétricaRamos Bahya
 
5 - Padrões de Herança
5 - Padrões de Herança5 - Padrões de Herança
5 - Padrões de HerançaRodrigo Vianna
 
Apresentação nr10
Apresentação nr10Apresentação nr10
Apresentação nr10foxtray
 
Ordem de Serviço (NR-01)
Ordem de Serviço (NR-01)Ordem de Serviço (NR-01)
Ordem de Serviço (NR-01)Filipe Tursi
 
Jeux adjectif possessif famille
Jeux adjectif possessif familleJeux adjectif possessif famille
Jeux adjectif possessif familleBatoul Fadel
 
Ergonomia Na Informatica
Ergonomia Na InformaticaErgonomia Na Informatica
Ergonomia Na InformaticaLeandro Ribeiro
 
Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1
Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1
Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1Vandernilson Scagion
 

Mais procurados (20)

Alterações cromossomiais
Alterações cromossomiaisAlterações cromossomiais
Alterações cromossomiais
 
NR_18_maquinas_equipamentos.pdf
NR_18_maquinas_equipamentos.pdfNR_18_maquinas_equipamentos.pdf
NR_18_maquinas_equipamentos.pdf
 
Treinamento-uso da betoneira
 Treinamento-uso da betoneira Treinamento-uso da betoneira
Treinamento-uso da betoneira
 
Modelo ficha de registro do diálogo diário de segurança (dds) - blog segura...
Modelo   ficha de registro do diálogo diário de segurança (dds) - blog segura...Modelo   ficha de registro do diálogo diário de segurança (dds) - blog segura...
Modelo ficha de registro do diálogo diário de segurança (dds) - blog segura...
 
Pp2 les possessifs
Pp2   les possessifsPp2   les possessifs
Pp2 les possessifs
 
[Bs 8800]-british standard-8800-1996[1]
[Bs 8800]-british standard-8800-1996[1][Bs 8800]-british standard-8800-1996[1]
[Bs 8800]-british standard-8800-1996[1]
 
HERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICA
HERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICAHERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICA
HERANÇA RELACIONADA AO SEXO-GENÉTICA BÁSICA
 
Procedimento de montagem elétrica
Procedimento de  montagem elétricaProcedimento de  montagem elétrica
Procedimento de montagem elétrica
 
5 - Padrões de Herança
5 - Padrões de Herança5 - Padrões de Herança
5 - Padrões de Herança
 
Apresentação nr10
Apresentação nr10Apresentação nr10
Apresentação nr10
 
Ordem de Serviço (NR-01)
Ordem de Serviço (NR-01)Ordem de Serviço (NR-01)
Ordem de Serviço (NR-01)
 
Jeux adjectif possessif famille
Jeux adjectif possessif familleJeux adjectif possessif famille
Jeux adjectif possessif famille
 
GenéTica
GenéTicaGenéTica
GenéTica
 
Andaimeparte1
Andaimeparte1Andaimeparte1
Andaimeparte1
 
Pt nova m odelo site001
Pt nova m odelo site001Pt nova m odelo site001
Pt nova m odelo site001
 
Decrire des objets
Decrire des objetsDecrire des objets
Decrire des objets
 
Heranca ligada sexo
Heranca ligada sexoHeranca ligada sexo
Heranca ligada sexo
 
Ergonomia Na Informatica
Ergonomia Na InformaticaErgonomia Na Informatica
Ergonomia Na Informatica
 
Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1
Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1
Nbr 16401 1 - 2008 - instalação de ar-condicionado-parte 1
 
Check list caminhão munck
Check list   caminhão munckCheck list   caminhão munck
Check list caminhão munck
 

Destaque

Регулярные выражения
Регулярные выраженияРегулярные выражения
Регулярные выраженияVladimir Logvinov
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17Sergey Platonov
 
Облачные вычисления
Облачные вычисленияОблачные вычисления
Облачные вычисленияDmitry Bulgakov
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметикуAndrey Akinshin
 
Введение в синтаксис C++, часть 1
Введение в синтаксис C++, часть 1Введение в синтаксис C++, часть 1
Введение в синтаксис C++, часть 1DEVTYPE
 
Страуструп - Язык программирования C++
Страуструп - Язык программирования C++Страуструп - Язык программирования C++
Страуструп - Язык программирования C++Alexey Miasoedov
 
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобноАлександр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобноYandex
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексYandex
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 

Destaque (20)

Регулярные выражения
Регулярные выраженияРегулярные выражения
Регулярные выражения
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Облачные вычисления
Облачные вычисленияОблачные вычисления
Облачные вычисления
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметику
 
Введение в синтаксис C++, часть 1
Введение в синтаксис C++, часть 1Введение в синтаксис C++, часть 1
Введение в синтаксис C++, часть 1
 
Страуструп - Язык программирования C++
Страуструп - Язык программирования C++Страуструп - Язык программирования C++
Страуструп - Язык программирования C++
 
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобноАлександр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
 
Programming in c++
Programming in c++Programming in c++
Programming in c++
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 

Semelhante a Регулярные выражения C++

Regexp
RegexpRegexp
Regexpkumup
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.Unguryan Vitaliy
 
строковые величины
строковые величиныстроковые величины
строковые величиныmetodkopilka
 
язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)Alex Shkotin
 
основы програмирования Pascal
основы програмирования Pascalосновы програмирования Pascal
основы програмирования Pascalliza2209
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularitiesmcroitor
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данныхЕлена Ключева
 
Полезные сервисы для копирайтеров и всех, кто пишет тексты
Полезные сервисы для копирайтеров и всех, кто пишет текстыПолезные сервисы для копирайтеров и всех, кто пишет тексты
Полезные сервисы для копирайтеров и всех, кто пишет текстыEkaterina Selivanova
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программTatyanazaxarova
 

Semelhante a Регулярные выражения C++ (20)

Module 5 1
Module 5 1Module 5 1
Module 5 1
 
ООП_лекция_11
ООП_лекция_11ООП_лекция_11
ООП_лекция_11
 
Автоматическое извлечение синтаксических контекстов из текстовой коллекции
Автоматическое извлечение синтаксических контекстов из текстовой коллекцииАвтоматическое извлечение синтаксических контекстов из текстовой коллекции
Автоматическое извлечение синтаксических контекстов из текстовой коллекции
 
Regexp
RegexpRegexp
Regexp
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
строковые величины
строковые величиныстроковые величины
строковые величины
 
язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)язык работы с КМАС (Yafoll сообщение 1)
язык работы с КМАС (Yafoll сообщение 1)
 
основы програмирования Pascal
основы програмирования Pascalосновы програмирования Pascal
основы програмирования Pascal
 
лек7
лек7лек7
лек7
 
лек8
лек8лек8
лек8
 
лек7
лек7лек7
лек7
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularities
 
Rule b platf
Rule b platfRule b platf
Rule b platf
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данных
 
Полезные сервисы для копирайтеров и всех, кто пишет тексты
Полезные сервисы для копирайтеров и всех, кто пишет текстыПолезные сервисы для копирайтеров и всех, кто пишет тексты
Полезные сервисы для копирайтеров и всех, кто пишет тексты
 
Regular Expressions
Regular ExpressionsRegular Expressions
Regular Expressions
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программ
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
алфавит
алфавиталфавит
алфавит
 

Mais de Dmitry Bulgakov

Философия: вводный курс
Философия: вводный курсФилософия: вводный курс
Философия: вводный курсDmitry Bulgakov
 
Matlab: Вычисление суммы членов ряда
Matlab: Вычисление суммы членов рядаMatlab: Вычисление суммы членов ряда
Matlab: Вычисление суммы членов рядаDmitry Bulgakov
 
Matlab: Вычисление производной
Matlab: Вычисление производнойMatlab: Вычисление производной
Matlab: Вычисление производнойDmitry Bulgakov
 
Matlab: Вычисление предела
Matlab: Вычисление пределаMatlab: Вычисление предела
Matlab: Вычисление пределаDmitry Bulgakov
 
Matlab: Построение 3D графика
Matlab: Построение 3D графикаMatlab: Построение 3D графика
Matlab: Построение 3D графикаDmitry Bulgakov
 
Matlab: Вычисление значения выражения в точке
Matlab: Вычисление значения выражения в точкеMatlab: Вычисление значения выражения в точке
Matlab: Вычисление значения выражения в точкеDmitry Bulgakov
 
Matlab: Вычисление значения выражения с параметром
Matlab: Вычисление значения выражения с параметромMatlab: Вычисление значения выражения с параметром
Matlab: Вычисление значения выражения с параметромDmitry Bulgakov
 
Matlab: Вычисление значения выражения
Matlab: Вычисление значения выраженияMatlab: Вычисление значения выражения
Matlab: Вычисление значения выраженияDmitry Bulgakov
 
Matlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравненияMatlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравненияDmitry Bulgakov
 
Matlab: Построение графика функции
Matlab: Построение графика функцииMatlab: Построение графика функции
Matlab: Построение графика функцииDmitry Bulgakov
 
Matlab: Написание m-файла
Matlab: Написание m-файлаMatlab: Написание m-файла
Matlab: Написание m-файлаDmitry Bulgakov
 
Проблемы внедрения систем Business Intelligence
Проблемы внедрения систем Business IntelligenceПроблемы внедрения систем Business Intelligence
Проблемы внедрения систем Business IntelligenceDmitry Bulgakov
 
Описание бизнес-процесса
Описание бизнес-процессаОписание бизнес-процесса
Описание бизнес-процессаDmitry Bulgakov
 
Инновации в сфере бизнеса
Инновации в сфере бизнесаИнновации в сфере бизнеса
Инновации в сфере бизнесаDmitry Bulgakov
 
How technology has changed our lives
How technology has changed our livesHow technology has changed our lives
How technology has changed our livesDmitry Bulgakov
 
Задания первого тура ACM ICPC Ukraine 2013
Задания первого тура ACM ICPC Ukraine 2013Задания первого тура ACM ICPC Ukraine 2013
Задания первого тура ACM ICPC Ukraine 2013Dmitry Bulgakov
 
Cоннеты Шекспира
Cоннеты ШекспираCоннеты Шекспира
Cоннеты ШекспираDmitry Bulgakov
 

Mais de Dmitry Bulgakov (20)

Философия: вводный курс
Философия: вводный курсФилософия: вводный курс
Философия: вводный курс
 
Matlab: Вычисление суммы членов ряда
Matlab: Вычисление суммы членов рядаMatlab: Вычисление суммы членов ряда
Matlab: Вычисление суммы членов ряда
 
Matlab: Вычисление производной
Matlab: Вычисление производнойMatlab: Вычисление производной
Matlab: Вычисление производной
 
Matlab: Вычисление предела
Matlab: Вычисление пределаMatlab: Вычисление предела
Matlab: Вычисление предела
 
Matlab: Построение 3D графика
Matlab: Построение 3D графикаMatlab: Построение 3D графика
Matlab: Построение 3D графика
 
Matlab: Вычисление значения выражения в точке
Matlab: Вычисление значения выражения в точкеMatlab: Вычисление значения выражения в точке
Matlab: Вычисление значения выражения в точке
 
Matlab: Вычисление значения выражения с параметром
Matlab: Вычисление значения выражения с параметромMatlab: Вычисление значения выражения с параметром
Matlab: Вычисление значения выражения с параметром
 
Matlab: Вычисление значения выражения
Matlab: Вычисление значения выраженияMatlab: Вычисление значения выражения
Matlab: Вычисление значения выражения
 
Matlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравненияMatlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравнения
 
Matlab: Построение графика функции
Matlab: Построение графика функцииMatlab: Построение графика функции
Matlab: Построение графика функции
 
Matlab: Написание m-файла
Matlab: Написание m-файлаMatlab: Написание m-файла
Matlab: Написание m-файла
 
Проблемы внедрения систем Business Intelligence
Проблемы внедрения систем Business IntelligenceПроблемы внедрения систем Business Intelligence
Проблемы внедрения систем Business Intelligence
 
Описание бизнес-процесса
Описание бизнес-процессаОписание бизнес-процесса
Описание бизнес-процесса
 
Инновации в сфере бизнеса
Инновации в сфере бизнесаИнновации в сфере бизнеса
Инновации в сфере бизнеса
 
Green data centers
Green data centersGreen data centers
Green data centers
 
How technology has changed our lives
How technology has changed our livesHow technology has changed our lives
How technology has changed our lives
 
Привычка
ПривычкаПривычка
Привычка
 
Задания первого тура ACM ICPC Ukraine 2013
Задания первого тура ACM ICPC Ukraine 2013Задания первого тура ACM ICPC Ukraine 2013
Задания первого тура ACM ICPC Ukraine 2013
 
Cоннеты Шекспира
Cоннеты ШекспираCоннеты Шекспира
Cоннеты Шекспира
 
Демократия
ДемократияДемократия
Демократия
 

Регулярные выражения C++

  • 1. Регулярные выражения 1 ОПРЕДЕЛЕНИ ОПРЕДЕЛЕНИЕ Регулярное выражение описывает одну или несколько строк, по которым выполняется сопоставление при поиске в тексте. Такое выражение служит в качестве шаблона для сравнения с текстом, в котором выполняется поиск. Регулярные выражения можно использовать для поиска шаблонов в строке, замены текста и извлечения подстрок. Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:  найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета», «терракотовый»;  найти отдельно стоящее слово «кот» и заменить его на «кошка»;  найти слово «кот», которому предшествует слово «персидский» или «чеширский»;  убрать из текста все предложения, в которых упоминается слово кот или кошка. В ISO-C++ нет стандартной поддержки регулярных выражений. Поддержка добавляется подключением библиотек  boost.  В С++ в TR1 есть cpp_regex, а в самый последних компиляторах в std::regex  poco  pcre. 2 СИНТАКСИС ОБЫЧНЫЕ И СПЕЦИАЛЬНЫЕ СИМВОЛЫ (МЕТАСИМВОЛЫ) Большинство символов в регулярном выражении представляют сами себя за исключением специальных символов [ ] / ^ $ . | ? * + ( ) { }, которые могут быть предварены символом (обратная косая черта) («экранированы», «защищены») для представления их самих в качестве символов текста. Можно экранировать целую последовательность символов, заключив её между Q и E. Аналогично могут быть представлены другие специальные символы (набор символов, требующих экранирования, может отличаться в зависимости от конкретной реализации). Часть символов, которые в той или иной реализации не требуют экранирования (например, угловые скобки < >), могут быть экранированы из соображений удобочитаемости.
  • 2. Метасимвол . (точка) означает один любой символ, но в некоторых реализациях исключая символ новой строки. СИМВОЛЬНЫЕ КЛАССЫ (НАБОРЫ СИМВОЛОВ) Набор символов в квадратных скобках [ ] именуется символьным классом и позволяет указать интерпретатору регулярных выражений, что на данном месте в строке может стоять один из перечисленных символов. В частности, [абв] задаёт возможность появления в тексте одного из трёх указанных символов, а [1234567890] задаёт соответствие одной из цифр. Возможно указание диапазонов символов: например, [А-Яа-я] соответствует всем буквам русского алфавита, за исключением букв «Ё» и «ё». Если требуется указать символы, которые не входят в указанный набор, то используют символ ^ внутри квадратных скобок, например [^0-9] означает любой символ, кроме цифр. Некоторые символьные классы можно заменить специальными метасимволами: ПОЗИЦИЯ ВНУТРИ СТРОКИ Следующие символы позволяют спозиционировать регулярное выражение относительно элементов текста: начала и конца строки, границ слова. КВАНТИФИКАЦИЯ (ПОИСК ПОСЛЕДОВАТЕЛЬНОСТЕЙ) Квантификатор после символа, символьного класса или группы определяет, сколько раз предшествующее выражение может встречаться. Следует учитывать, что квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа.
  • 3. Ква́нтор — общее название для логических операций, ограничивающих область истинности какого-либо предиката и создающих высказывание. Часто используется последовательность .* для обозначения любого количества любых символов между двумя частями регулярного выражения. Если символы { } не образуют квантификатор, их специальное значение игнорируется. УПРАВЛЯЮЩИЕ СИМВОЛЫ
  • 4. ОБОЗНАЧЕНИЕ ГРУППЫ Круглые скобки используются для определения области действия и приоритета операций. Шаблон внутри группы обрабатывается как единое целое и может быть квантифицирован. Например, выражение (тр[ау]м-?)* найдёт последовательность вида трам-трам-трумтрам-трум-трамтрум. МОДИФИКАТОРЫ Модификаторы действуют с момента вхождения и до конца регулярного выражения или противоположного модификатора. Некоторые интерпретаторы могут применить модификатор ко всему выражению, а не с момента его вхождения. Группы-модификаторы можно объединять в одну группу: (?i-sm). Такая группа включает режим i и выключает режим s, m. Если использование модификаторов требуется только в пределах группы, то нужный шаблон указывается внутри группы после модификаторов но перед двоеточием. Например, (?-i)(?i:tv)set найдёт TVset, но не TVSET. ПЕРЕЧИСЛЕНИЕ Вертикальная черта разделяет допустимые варианты. Например, gray|grey соответствует gray или grey. Следует помнить, что перебор вариантов выполняется слева направо, как они указаны. Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу. Например, gray|grey или gr(a|e)y описывают строку gray или grey. В случае с односимвольными альтернативами предпочтителен вариант gr[ae]y, так как сравнение с символьным классом выполняется проще, чем обработка группы с проверкой на все её возможные модификаторы и генерацией обратной связи.
  • 5. ПРОСМОТР ВПЕРЁД И НАЗАД В большинстве реализаций регулярных выражений есть способ производить поиск фрагмента текста, «просматривая» (но не включая в найденное) окружающий текст, который расположен до или после искомого фрагмента текста. Например, таким способом легко найти имя тега HTML, не включая в результат поиска окружающие его угловые скобки или другие знаки, но и не упуская их «из внимания» при поиске нужного контекста. Просмотр с отрицанием используется реже и «следит» за тем, чтобы указанные соответствия, напротив, не встречались до или после искомого текстового фрагмента. ПОИСК ПО УСЛОВИЮ Во многих реализациях регулярных выражений существует возможность выбирать, по какому пути пойдёт проверка в том или ином месте регулярного выражения на основании уже найденных значений.
  • 6. 3 ИСПОЛЬЗОВАНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ В C++ 11 Для использования регулярных выражений в C++ необходимо подключить стандартную библиотеку regex. Основные функции для работы содержатся в пространстве имен std. Функциями, используемыми для применения регулярных выражений являются:  regex_match – проверяет соответствие всей последовательности символов регулярному выражению  regex_search – проверяет регулярное выражение в любой части последовательности  regex_replace – заменяет найденный символы, найденные регулярным выражением форматированной строкой. REGEX_MATCH Функция regex_match проверяет всю строку на соответствие регулярному выражению, и возвращает true, если они совпадают. Regex_match имеет множество прототипов, одним из вариантов использования является данный прототип template <class ST, class SA, char charT, class traits> bool regex_match (const basic_string<charT,ST,SA>& s, const basic_regex<charT,traits>& rgx, regex_constants::match_flag_type flags = regex_constants::match_default); Пояснение  Первый аргумент – строка типа string, в которой будем производить поиск  Второй аргумент – объект класса regex, в котором записано регулярное выражение  Третий аргумент – необязательное поле для флагов Например, эту функцию можно записать так: std::string s ("1"); std::regex e ("[[:digit:]]""); bool search = std::regex_match (s,e);
  • 7. Пример: Напишем программу, которая будет проверять, записано в строке целое число, или любой другой набор символов. Регулярным выражением для поиска числа будет данное выражение ("-?[[:digit:]]+") -? – говорит о том, что первым символом может быть минус [[:digit:]] – будем искать исключительно числовые символы (0-9) + – это значит, что числовых символов может быть больше одного Тогда программа будет иметь такой вид: REGEX_SEARCH Данная функция работает аналогично функции regex_search, с тем отличием, что тут проверяется не полное соответствие строки регулярному выражению, true будет возвращено и при частичном совпадении. Прототип функции совпадает с предыдущим примером. template <class ST, class SA, char charT, class traits> bool regex_search (const basic_string<charT,ST,SA>& s, const basic_regex<charT,traits>& rgx, regex_constants::match_flag_type flags = regex_constants::match_default);
  • 8. Пример: Эта программа будет искать все слова с частью “ello”. Регулярное выражение будет очень простым, и иметь вид “ello” REGEX_REPLACE Функция regex_replace производит поиск поиск в строке по заданному регулярному выражению и производит замену найденных значений на заданную строку. Прототип функции имеет вид: template <class traits, class charT, class ST, class SA> basic_string<charT> regex_replace (const charT*s,const basic_regex<charT,traits>& rgx, const basic_string<charT,ST,SA>& fmt, regex_constants::match_flag_type flags = regex_constants::match_default);  Первый аргумент – строка типа string, в которой будем производить поиск  Второй аргумент – объект класса regex, в котором записано регулярное выражение  Третий аргумент – строка типа string, в которая будет замещать найденные значения  Четвертый аргумент - необязательное поле для флагов Пример записи функции: regex_replace(input_string, regular_expression, replace_string);
  • 9. Пример: Напишем программу, которая будет заменять слово “world” в исходной строке на слово “planet”. Регулярное выражение будет иметь вид “world”.