0Pricing
C++ Academy · Урок

Основы 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы regex
  2. Группы захвата
  3. Поиск и замена
  4. Замечания о производительности
← Назад к C++ Academy