Флаг regex::multiline
Флаг regex::multiline включает многострочный режим
сопоставления в регулярных выражениях C++. В этом режиме
символы '^' и '$' начинают обозначать не начало
и конец всей строки, а начало и конец каждой строки внутри
текста. Границей строк считается символ перевода строки
'\n'. Этот флаг передается в параметр flags
при создании объекта std::regex или при вызове
функций сопоставления.
Синтаксис
std::regex::multiline
Пример
Давайте проверим, как флаг multiline влияет на
поиск начала строки. Сначала попробуем без флага:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string text = "abcde\n12345";
regex re("^12345$");
if (regex_search(text, re)) {
cout << "match" << endl;
} else {
cout << "no match" << endl;
}
return 0;
}
Результат выполнения кода:
"no match"
Без флага multiline символ '^' означает только
начало всей строки, поэтому совпадения нет. Теперь добавим
флаг multiline:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string text = "abcde\n12345";
regex re("^12345$", regex::multiline);
if (regex_search(text, re)) {
cout << "match" << endl;
} else {
cout << "no match" << endl;
}
return 0;
}
Результат выполнения кода:
"match"
Пример
Давайте найдем все строки в тексте, которые начинаются с
цифры, используя regex_iterator и флаг
multiline:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string text = "abcde\n12345\nxyz\n67890";
regex re("^\\d+", regex::multiline);
for (sregex_iterator it(text.begin(), text.end(), re), end; it != end; ++it) {
cout << it->str() << endl;
}
return 0;
}
Результат выполнения кода:
12345
67890
Смотрите также
-
класс
regex,
который представляет регулярное выражение -
флаг
icase,
который включает игнорирование регистра -
флаг
ECMAScript,
который задает грамматику регулярных выражений -
функция
regex_search,
которая ищет первое совпадение в строке