Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Unicode Regular Expression Algorithms

Boost , Boost.Regex 5.1.2 , Working With Unicode and ICU String Types

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Регулярные алгоритмы экспрессии<regex_match>,<regex_search>и<regex_replace>все ожидают, что последовательность символов, на которой они действуют, кодируется в том же самом кодировании символа, что и объект регулярного выражения, с которым они используются. Для регулярных выражений Unicode поведение нежелательно: хотя мы можем захотеть обрабатывать данные в «кусках» UTF-32, фактические данные гораздо чаще кодируются как UTF-8 или UTF-16. Таким образом, заголовокобеспечивает ряд тонких оберток вокруг этих алгоритмов, называемых<u32regex_match>,<u32regex_search>и<u32regex_replace>. Эти обертки используют внутренние итераторы, чтобы внешние данные UTF-8 или UTF-16 выглядели так, как будто это действительно последовательность UTF-32, которая затем может быть передана «реальному» алгоритму.

u32regex_match

Для каждого<regex_match>алгоритма, определенного<<boost/regex.hpp>>, затем<<boost/regex/icu.hpp>>определяет перегруженный алгоритм, который принимает те же аргументы, но который называется<u32regex_match>, и который принимает закодированные данные UTF-8, UTF-16 или UTF-32, а также UnicodeString ICU в качестве ввода.

Пример: сопоставить пароль, закодированный в UTF-16 UnicodeString:

//
// Find out if *password* meets our password requirements,
// as defined by the regular expression *requirements*.
//
bool is_valid_password(const UnicodeString& password, const UnicodeString& requirements)
{
   return boost::u32regex_match(password, boost::make_u32regex(requirements));
}

Пример: сопоставьте кодированное имя файла UTF-8:

//
// Extract filename part of a path from a UTF-8 encoded std::string and return the result
// as another std::string:
//
std::string get_filename(const std::string& path)
{
   boost::u32regex r = boost::make_u32regex("(?:\\A|.*\\\\)([^\\\\]+)");
   boost::smatch what;
   if(boost::u32regex_match(path, what, r))
   {
      // extract $1 as a std::string:
      return what.str(1);
   }
   else
   {
      throw std::runtime_error("Invalid pathname");
   }
}
u32regex_search

Для каждого<regex_search>алгоритма, определенного<<boost/regex.hpp>>, затем<<boost/regex/icu.hpp>>определяет перегруженный алгоритм, который принимает те же аргументы, но который называется<u32regex_search>, и который принимает закодированные данные UTF-8, UTF-16 или UTF-32, а также UnicodeString ICU в качестве ввода.

Пример: поиск последовательности символов в определенном языковом блоке:

UnicodeString extract_greek(const UnicodeString& text)
{
   // searches through some UTF-16 encoded text for a block encoded in Greek,
   // this expression is imperfect, but the best we can do for now - searching
   // for specific scripts is actually pretty hard to do right.
   //
   // Here we search for a character sequence that begins with a Greek letter,
   // and continues with characters that are either not-letters ( [^[:L*:]] )
   // or are characters in the Greek character block ( [\\x{370}-\\x{3FF}] ).
   //
   boost::u32regex r = boost::make_u32regex(
         L"[\\x{370}-\\x{3FF}](?:[^[:L*:]]|[\\x{370}-\\x{3FF}])*");
   boost::u16match what;
   if(boost::u32regex_search(text, what, r))
   {
      // extract $0 as a UnicodeString:
      return UnicodeString(what[0].first, what.length(0));
   }
   else
   {
      throw std::runtime_error("No Greek found!");
   }
}
u32regex_replace

Для каждого<regex_replace>алгоритма, определенного<<boost/regex.hpp>>, затем<<boost/regex/icu.hpp>>определяет перегруженный алгоритм, который принимает те же аргументы, но который называется<u32regex_replace>, и который принимает закодированные данные UTF-8, UTF-16 или UTF-32, а также UnicodeString ICU в качестве ввода. Последовательность ввода и спецификатор строки формата, переданный алгоритму, могут быть закодированы независимо (например, один может быть UTF-8, другой в UTF-16), но в аргументе итератора строки/выхода результата должно использоваться то же кодирование символов, что и в искомом тексте.

Пример: номер кредитной карты переформатировать:

//
// Take a credit card number as a string of digits, 
// and reformat it as a human readable string with "-"
// separating each group of four digit;, 
// note that we're mixing a UTF-32 regex, with a UTF-16
// string and a UTF-8 format specifier, and it still all 
// just works:
//
const boost::u32regex e = boost::make_u32regex(
      "\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z");
const char* human_format = "$1-$2-$3-$4";
UnicodeString human_readable_card_number(const UnicodeString& s)
{
   return boost::u32regex_replace(s, e, human_format);
}

PrevUpHomeNext

Статья Unicode Regular Expression Algorithms раздела Boost.Regex 5.1.2 Working With Unicode and ICU String Types может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Working With Unicode and ICU String Types ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:34:36/0.0061688423156738/1