using namespace boost; // если вы используете реализацию библиотеки
// boost
// получаем извне шаблон и набор строк
// проверяем шаблон и ищем строки, содержащие этот шаблон
int main()
{
regex pattern;
string pat;
cout << "введите шаблон: ";
getline(cin,pat); // считываем шаблон
try {
pattern = pat; // проверка шаблона
cout << "Шаблон: " << pattern << '\n';
}
catch (bad_expression) {
cout << pat
<< "Не является корректным регулярным выражением\n";
exit(1);
}
cout << "Введите строки:\n";
string line; // входной буфер
int lineno = 0;
while (getline(cin,line)) {
++lineno;
smatch matches;
if (regex_search(line, matches, pattern)) {
cout << " строка " << lineno << ": " << line << '\n';
for (int i = 0; i
cout << "\tmatches[" << i << "]: "
<< matches[i] << '\n';
}
else
cout << "не соответствует \n";
}
}
ПОПРОБУЙТЕ
Запустите эту программу и попробуйте применить ее для проверки нескольких шаблонов, например abc, x.*x, ( .* ), \([^)]*\) и \ w+\w+(Jr\.) ?.
23.9. Сравнение регулярных выражений
• regex_search()
ищет этот шаблон как подстроку в потоке.
• regex_match()
ищет полное соответствие шаблона и строки.
Одним из примеров является поиск почтовых индексов в разделе 23.6. Рассмотрим извлечение данных из следующей таблицы.
Эта совершенно типичная и не очень сложная таблица (количество учеников в 2007 году в средней школе, в которой учился Бьярне Страуструп) извлечена с веб страницы, на которой она выглядела именно так, как нам нужно.
• Содержит числовые поля.
• Содержит символьные поля в строках, понятных только людям, знающим контекст, из которого извлечена таблица. (В данном случае ее могут понять только люди, знающие датский язык.)
• Символьные строки содержат пробелы.
• Поля отделены друг от друга разделителем, роль которого в данном случае играет символ табуляции.
Проиллюстрируем использование регулярных выражения для решения следующих задач.
• Убедимся, что таблица сформирована правильно (т.е. каждая строка имеет правильное количество полей).
• Убедимся, что суммы подсчитаны правильно (в последней строке содержатся суммы чисел по столбцам).
Для того чтобы проанализировать эту таблицу, нам нужны два шаблона: для заголовка и для остальных строк.
regex header( "^[\\w ]+( [\\w ]+)*$");
regex row( "^[\\w ]+(\\d+)(\\d+)(\\d+)$");