C++. Сборник рецептов.

4.24. Использование регулярных выражений для разделения строки.

Проблема.

Требуется разделить строку на лексемы, но необходимо выполнить более сложный поиск, чем показано в рецепте 4.7. Например, могут потребоваться лексемы, разделенные более чем одним символом или имеющие несколько различных форм. Это часто приводит к большому коду и путанице среди пользователей вашего класса или функции.

Решение.

Используйте шаблон класса regex Boost. regex позволяет использовать для строк и текстовых данных регулярные выражения. Пример 4.33 показывает, как использовать regex для разделения строк.

Пример 4.33. Использование регулярных выражений Boost.

#include <iostream>

#include <string>

#include <boost/regex.hpp>

Int main() {

 std::string s = "who,lives-in-a,pineapple under the sea?";

 boost::regex re(',|:|-|\\s+"); // Создаем регулярное выражение.

 boost::sregex_token_iterator   // Создаем итератор, используя.

 p(s.begin(), s.end(), re, -1), // последовательность и это выражение.

  boost::sregex_token_iterator end; // Создаем маркер.

                                    // «конец-рег-выражения».

 while (p != end).

  std::cout << *p++ << '\n';

}

Обсуждение.

Пример 4.33 показывает, как использовать regex для перебора соответствий регулярному выражению. Следующая строка создает регулярное выражение.

Boost::regex re(' ,|:| -|\\s+");

Она гласит, что каждое соответствие регулярному выражению — это либо запятая, либо двоеточие, либо тире, либо один или несколько пробелов. Символ канала — это логический оператор OR, используемый для объединения разделителей. Следующие две строки создают итератор.

Boost::sregex_token_iterator.

P(s.begin(), s.end(), re, -1);

Boost::sregex_token_iterator end;

Итератор p создается с помощью регулярного выражения и входной строки. После его создания p можно рассматривать как итератор для последовательности из стандартной библиотеки, sregex_token_iterator создается без аргументов и является специальным значением, представляющим конец последовательности лексем регулярного выражения, и, следовательно, может использоваться для проверки достижения конца.