Стандартная библиотека 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 <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 <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 <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 <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 <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;
}