2016-07-22 1 views
2

Я использую следующий код, чтобы попытаться сопоставить символы с помощью regex (например, я пытаюсь совместить символ звезды круга, http://graphemica.com/%E2%9C%AA)Общие символы ' p {S}' не были сопоставлены с использованием boost wregex

#include <boost/regex.hpp> 

//... 
std::wstring text = L"a✪c"; 
auto re = L"(\\p{S}|\\p{L})+?"; 
boost::wregex r(re); 
boost::regex_token_iterator<std::wstring::const_iterator> 
    i(boost::make_regex_token_iterator(text, r, 1)), j; 
while (i != j) 
{ 
    std::wstring x = *i; 
    ++i; 
} 
//... 

значение байт text является {97, 10026, 99}, (или `{0x61,0x272A, 0x63} '). Таким образом, это действительный символ.

Код соответствует 2 буквы, 'a'0x61 и 'c'``0x63, но не символ (0x272A). Я пробовал это с несколькими другими символами, и никто из них не работает (например, ©).

Что мне здесь не хватает?

+0

Интересно, что '' и '' '' принадлежат '\ p {So }' категории. Что делать, если вы просто используете '\\ p {So}' или 'auto re = L" [\\ p {So} \\ p {S} \\ p {L}] ";'? (Ваш '+?' Является избыточным, если вы хотите совместить 1 символ за раз). –

+0

Кажется, что это не работает, я получаю следующую ошибку: 'Escape sequence не было ни действительным, ни допустимым именем класса символов. Ошибка при анализе регулярного выражения: '(\ p {So} >>> ЗДЕСЬ >>>)'. ' – FFMG

ответ

2

В документации Boost.Regex указано, что there's no support for Unicode-specific character classes при использовании boost::wregex.

Если вы хотите эту функциональность, вам необходимо включить build Boost.Regex with ICU support, а затем использовать тип boost::u32regex вместо boost::wregex.

+0

Теперь имеет смысл, спасибо. – FFMG

Смежные вопросы