Класс smatch
Класс smatch - это специализация шаблонного класса
match_results для строк типа std::string.
Он используется для хранения результатов поиска совпадений
регулярного выражения в строке. Объект smatch
заполняется функциями regex_search и
regex_match. Первый элемент контейнера с индексом
0 всегда хранит полное совпадение, а последующие
элементы - совпадения с захваченными группами.
Синтаксис
#include <regex>
std::smatch match;
Пример
Давайте найдем первое число в строке и выведем полное совпадение и первую захваченную группу:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "abc123def";
regex re("([0-9]+)");
smatch match;
if (regex_search(str, match, re)) {
cout << match[0] << endl;
cout << match[1] << endl;
}
return 0;
}
Результат выполнения кода:
123
123
Пример
Давайте переберем все совпадения в строке с помощью
итераторов sregex_iterator и выведем каждое из них:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "a1 b2 c3";
regex re("([a-z])([0-9])");
sregex_iterator it(str.begin(), str.end(), re);
sregex_iterator end;
while (it != end) {
smatch match = *it;
cout << match[0] << endl;
it++;
}
return 0;
}
Результат выполнения кода:
"a1"
"b2"
"c3"
Пример
Давайте проверим, найдено ли совпадение, с помощью
метода empty и выведем количество совпадений:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "abcde";
regex re("([0-9]+)");
smatch match;
if (regex_search(str, match, re)) {
cout << match.size() << endl;
} else {
cout << "no match" << endl;
}
return 0;
}
Результат выполнения кода:
"no match"