Стандартная библиотека C++<regex>

В стандартной библиотеке C++,<regex>заголовочный файл предоставляет функциональность регулярных выражений, позволяя разработчикам очень гибко искать, заменять или разделять строки. Регулярные выражения — мощный инструмент обработки текста, широко используемый в таких областях, как проверка данных, анализ текста и сопоставление с образцом.

Регулярное выражение — это шаблон, который использует одну строку для описания и сопоставления ряда строк, соответствующих определённому синтаксическому правилу. В C++ регулярные выражения реализованы через<regex>Реализация библиотеки.

В C++11<regex>При использовании регулярных выражений необходимо экранировать обратные слеши в строковых литералах.\экранировать его, то есть записать его как двойной обратный слеш\\。

Почему двойной обратный слеш?

Компилятор C++ сначала обрабатывает escape-символы в строковых литералах, а движок регулярных выражений обрабатывает их после этого.

Например, вы пишете\d+, компилятор выполнит\dэто будет обработано как неизвестный escape-символ, вызывая ошибку, или станетd, правильный синтаксис\\d+, компилятор сначала\\преобразует в\, и когда движок регулярных выражений затем читает\d。

C++11 также поддерживает необработанные строки, которые позволяют избежать двойных обратных слешей и очень подходят для написания сложных регулярных выражений:
regex re(R"(\d+)");         // 原始字符串,不需要写 \\d
  • Содержимое внутри R"(...)" не будет подвергаться обработке escape-последовательностей.
  • Рекомендуется использовать это при написании сложных регулярных выражений с несколькими обратными слешами.

Базовый синтаксис

Основные компоненты регулярных выражений

  • класс символов: например[abc]Означает сопоставление с любым одним символом из a, b или c.
  • квантификатор: например*(ноль или более раз),+(один или более раз),?(ноль или один раз).
  • сопоставление границ: например^(начало строки),$(конец строки).
  • группировка: с помощью круглых скобок()чтобы создать группу.

C++ <regex>Основные классы и функции библиотеки

  • std::regex: представляет собой объект регулярного выражения.
  • std::regex_match: Проверяет, соответствует ли вся строка регулярному выражению.
  • std::regex_search: ищет в строке части, соответствующие регулярному выражению.
  • std::regex_replace: Заменяет части строки, соответствующие регулярному выражению.
  • std::sregex_iterator: Итератор, используемый для обхода всех совпадений.

Пример

1. Полное сопоставление: regex_match

Пример

#include <iostream>
#include <regex>
using namespace std;

int main() {
    regex re("\\d+");          // совпадение с цифрами
    string s = "12345";

    if (regex_match(s, re))
        cout << "Совпадение успешно\n";
    else
        cout << "Совпадение не удалось\n";
}

Результат вывода:

Match successful

2. Проверить, соответствует ли строка регулярному выражению

Пример

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main() {
    string text = "Привет, мир!";
    regex pattern("^[a-zA-Z]+, [a-zA-Z]+!$");

    if (regex_match(text, pattern)) {
        cout << "Строка соответствует шаблону." << endl;
    } else {
        cout << "Строка не соответствует шаблону." << endl;
    }

    return 0;
}

Результат вывода:

The string matches the pattern.

3. Поиск совпадений в строке

Пример

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main() {
    string text = "123-456-7890 и 987-654-3210";
    regex pattern("\\d{3}-\\d{3}-\\d{4}");

    smatch matches;
    while (regex_search(text, matches, pattern)) {
        cout << "Найдено: " << matches[0] << endl;
        text = matches.suffix().str();  // продолжить поиск оставшейся части
    }

    return 0;
}

Результат вывода:

Found: 123-456-7890
Found: 987-654-3210

4. Замена совпавших элементов в строке

Пример

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main() {
    string text = "Привет, мир!";
    шаблон регулярного выражения("World");
    строковая замена = "Universe";

    строковый результат = regex_replace(text, pattern, replacement);

    cout << "Исходный: " << text << endl;
    cout << "Изменённый: " << result << endl;

    return 0;
}

Результат вывода:

Original: Hello, World!
Modified: Hello, Universe!

Больше контента

Общие классы и типы

Name Описание
std::regex Скомпилировать объект регулярного выражения
std::smatch std::stringРезультат совпадения
std::cmatch Результаты совпадений C-строк (const char*)
std::sregex_iterator используется дляstd::stringитератор совпадений
std::cregex_iterator Итератор совпадений для C-строк
std::syntax_option_type Параметры синтаксиса регулярных выражений
std::match_flag_type Флаги управления совпадениями

Общие функции

Имя функции Назначение Возвращаемое значение Пример
regex_match(s, re) Проверить, соответствует ли вся строка bool regex_match("123", re)
regex_search(s, m, re) Найти первое совпадение bool regex_search(s, m, re)
regex_replace(s, re, fmt) заменить совпадения string regex_replace(s, re, "#")

smatchОбъект результата совпадения

член Описание Пример
m.str() Вернуть всё совпавшее содержимое cout << m.str()
m[i] Вернуть i-ю группу захвата m[1].str()
m.position() Начальная позиция совпадения m.position(0)
m.size() количество групп захвата m.size()
m.empty() Является ли совпадение пустым m.empty()

Общий синтаксис регулярных выражений

символ Значение Пример
. любой символ a.cсовпадениеabc
\d Цифры \d+
\w Буквенно-цифровые символы и подчёркивание \w+
\s пробельный символ \s+
^ начало ^abc
$ end xyz$
+ 1 или более раз a+
* 0 или более раз a*
? 0 или 1 раз a?
{n,m} n~m раз \d{2,4}
() захватывающая группа (ab)+
[] набор символов [A-Z]
` ` или `cat dog`

В строке исходного кода C++ нужно написать\\dвместо\d, потому что\нужно экранировать.

Типичные примеры использования

Пример

#include <iostream>
#include <regex>
using namespace std;

int main() {
    regex re("\\d+");
    string s = "abc123def456";

    // Найти первое совпадение
    smatch m;
    if (regex_search(s, m, re))
        cout << "Первое совпадение: " << m.str() << endl;

    // Перебрать все совпадения
    for (sregex_iterator it(s.begin(), s.end(), re), end_it; it != end_it; ++it)
        cout << "Совпадение: " << it->str() << endl;

    // Заменить
    string result = regex_replace(s, re, "#");
    cout << result << endl;
}
Другие расширения