Основы regex
Сопоставляйте шаблоны в тексте
«Основы regex» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что такое <regex>?
Заголовок <regex> позволяет сопоставлять текст с шаблонами регулярных выражений, которые описывают наборы строк. Вы создаёте шаблон, а затем проверяете или ищете с его помощью текст.
std::regexхранит скомпилированный шаблон.- Функции сопоставления сообщают, соответствует ли текст шаблону.
#include <iostream>
#include <regex>
int main() {
std::regex pattern("hello");
std::cout << std::boolalpha << std::regex_match("hello", pattern) << '\n';
return 0;
}regex_match и regex_search
regex_match требует полного соответствия всей строки. regex_search завершается успешно, если шаблон встречается где-либо в строке.
#include <iostream>
#include <regex>
int main() {
std::regex p("cat");
std::string s = "the cat sat";
std::cout << std::boolalpha;
std::cout << "match: " << std::regex_match(s, p) << '\n';
std::cout << "search: " << std::regex_search(s, p) << '\n';
return 0;
}Классы символов
Квадратные скобки задают набор допустимых символов. [aeiou] соответствует любой одной гласной; диапазоны вроде [a-z] соответствуют строчным буквам.
#include <iostream>
#include <regex>
int main() {
std::regex p("[a-z]+");
std::cout << std::boolalpha << std::regex_match("hello", p) << '\n';
std::cout << std::regex_match("Hello", p) << '\n';
return 0;
}Квантификаторы
Квантификаторы управляют повторением: * — ноль или более раз, + — один или более раз, ? — необязательный элемент, а {n,m} — диапазон количества повторений.
#include <iostream>
#include <regex>
int main() {
std::regex p("a+b");
std::cout << std::boolalpha;
std::cout << std::regex_match("aaab", p) << '\n';
std::cout << std::regex_match("b", p) << '\n';
return 0;
}Предопределённые классы
Сокращённые классы избавляют от лишнего ввода: \\d соответствует цифре, \\w — символу слова, \\s — пробельному символу. В исходном коде C++ обратную косую черту записывают дважды.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d+");
std::cout << std::boolalpha;
std::cout << std::regex_match("12345", p) << '\n';
std::cout << std::regex_match("12a45", p) << '\n';
return 0;
}Якоря
Якоря привязывают соответствие к определённой позиции: ^ обозначает начало, а $ — конец текста. Они соответствуют позициям, а не символам.
#include <iostream>
#include <regex>
int main() {
std::regex p("^abc$");
std::cout << std::boolalpha;
std::cout << std::regex_search("abc", p) << '\n';
std::cout << std::regex_search("xabc", p) << '\n';
return 0;
}Чередование
Вертикальная черта | означает «или». Шаблон cat|dog соответствует любому из этих слов. Используйте круглые скобки, чтобы ограничить область его действия.
#include <iostream>
#include <regex>
int main() {
std::regex p("cat|dog");
std::cout << std::boolalpha;
std::cout << std::regex_match("cat", p) << '\n';
std::cout << std::regex_match("dog", p) << '\n';
std::cout << std::regex_match("fish", p) << '\n';
return 0;
}Экранирование специальных символов
Такие символы, как ., * и (, имеют специальное значение. Экранируйте их обратной косой чертой, чтобы сопоставлять их буквально.
#include <iostream>
#include <regex>
int main() {
std::regex p("3\\.14");
std::cout << std::boolalpha;
std::cout << std::regex_match("3.14", p) << '\n';
std::cout << std::regex_match("3x14", p) << '\n';
return 0;
}Сопоставление без учёта регистра
При создании шаблона передайте такой флаг, как std::regex::icase, чтобы при сопоставлении игнорировать регистр букв.
#include <iostream>
#include <regex>
int main() {
std::regex p("hello", std::regex::icase);
std::cout << std::boolalpha;
std::cout << std::regex_match("HELLO", p) << '\n';
std::cout << std::regex_match("Hello", p) << '\n';
return 0;
}Простая проверка
Шаблоны отлично подходят для проверки формата входных данных, например для определения того, похожа ли строка на обычное число с необязательным знаком.
#include <iostream>
#include <regex>
bool isNumber(const std::string& s) {
static const std::regex p("-?\\d+");
return std::regex_match(s, p);
}
int main() {
std::cout << std::boolalpha;
std::cout << isNumber("-42") << '\n';
std::cout << isNumber("4a2") << '\n';
return 0;
}Многократное сопоставление
Объединяйте классы и квантификаторы, чтобы проверять более сложные форматы, например последовательность букв, за которой следуют цифры.
#include <iostream>
#include <regex>
int main() {
std::regex p("[A-Za-z]+\\d+");
std::cout << std::boolalpha;
std::cout << std::regex_match("abc123", p) << '\n';
std::cout << std::regex_match("123abc", p) << '\n';
return 0;
}Быстрая проверка
Проверьте своё понимание различий между сопоставлением и поиском.
Итоги
Вы изучили основы <regex>:
regex_matchдля всей строки иregex_searchдля соответствий подстроке- классы символов, квантификаторы, якоря и чередование
- предопределённые классы, такие как
\\d, и экранирование специальных символов - флаги, такие как
icase
Далее Вы узнаете, как извлекать определённые части соответствия с помощью групп захвата.
Часто задаваемые вопросы
Урок «Основы regex» бесплатный?
Да — полный текст урока «Основы regex» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы regex»?
Сопоставляйте шаблоны в тексте Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Основы regex»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.