вторник, 1 марта 2011 г.

Regex is simple

Регулярные выражения — очень удобное средство для валидации, поиска и замены строк. Пользоваться ими не сложно, хотя, ходят упорные слухи, что инструмент сложный и больше путает, чем помогает. Но, волков бояться — в лес не ходить, поэтому рекомендую к использованию. Например, простейший пример с использованием Boost.Regex будет выглядеть так:
// regex_test.cpp
#include <iostream>
#include <boost/regex.hpp>

int main()
{
  // правило поиска
  boost::wregex exrp( L"(https?:\\/\\/[\\w\\-_]+(?>\\.[\\w\\-_]+)+"
    L"(?>[\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#]))" );
  boost::match_results<std::wstring::const_iterator> what;
  // входная строка
  std::wstring input = L"My homepage is http://jia3ep.blogspot.com";
  // поиск
  if( regex_search( input,  what, exrp ) ) {
    // ога, нашли что-то
    std::wstring found( what[1].first, what[1].second );
    // выводим
    std::wcout << found << std::endl;    
  }

  return 0;
}

// в Boost немного вещей требуют линковки и Regex — одна из них,
// поэтому в Ubuntu компилим этот пример так:
// g++ -lboost_regex regex_test.cpp
Данный код найдет и выдаст Веб-адрес в заданной строке. Как сравочник синтаксиса можно использовать MSDN (мне тут нравится табличка, но аналогов в сети полно), а поискать готовые выражения можно, например, тут (правда, по ссылке встречаются и неработающие примеры).

Бывают, конечно, примеры в жизни и посложнее, чем приведенный. Например, вот более 6Кб кода для проверки email адреса соответствию стандарту RFC822. Но, к счастью, этот пример уже написан и его можно взять и скопировать.

Комментировать в ВКонтакте