Как использовать диапазон Юникода в регулярных выражениях C ++

Я должен использовать диапазон Юникода в регулярных выражениях в C ++. По сути, мне нужно иметь регулярное выражение для принятия всех допустимых символов Юникода. Я только что попробовал с тестовым выражением и столкнулся с некоторыми проблемами с ним.

std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$");

Это проблема с\\u?

 Wiktor Stribiżew23 июн. 2016 г., 12:32
Удалить\\u0080-\\uDB7F и попытаться соответствовать124, Если это соответствует, да, проблема в\\u0080-\\uDB7F.
 vijin23 июн. 2016 г., 12:49
в основном, мне нужно иметь регулярное выражение для принятия всех допустимых символов Юникода. Выражение, приведенное в вопросе, было просто тестовым регулярным выражением. Я изменю вопрос соответственно.
 Baum mit Augen23 июн. 2016 г., 12:43
@ WiktorStribiżew uDB7F и большинство вещей до этого определенно не вписываются вchar.
 Baum mit Augen23 июн. 2016 г., 12:34
Проблема в том, что в С ++ нет полезной поддержки Юникода. Используйте что-то вроде ICU.
 Wiktor Stribiżew23 июн. 2016 г., 12:35
Или Boost также хорошая альтернатива. КСТАТИ,Проверь это: помощи ЮникоднойEscapeПоследовательности это письмоu затем ровно четырешестн._число, Этот символ экранирования совпадает с символом, чья единица кода равна числовому значению этого четырехзначного шестнадцатеричного числа. Если значение не вписывается в этоstd::basic_regex«sДиаграмма, std::regex_error выбрасывается (только C ++).
 Wiktor Stribiżew23 июн. 2016 г., 12:44
@BaummitAugen: Вот почему, возможно,wregex мог бы помочь. У меня нет времени, чтобы проверить это сейчас

Ответы на вопрос(1)

Решение Вопроса

std::wregex а такжеstd::wsmatch, Вам нужно будет преобразовать исходную строку и регулярное выражение вширокий символьный юникод (UTF-32 в Linux, UTF-16 (ish) в Windows), чтобы заставить его работать.

Это работает для меня, где исходный текстUTF-8:

inline std::wstring from_utf8(const std::string& utf8)
{
    // code to convert from utf8 to utf32/utf16
}

inline std::string to_utf8(const std::wstring& ws)
{
    // code to convert from utf32/utf16 to utf8
}

int main()
{
    std::string test = "[email protected]神谕.com"; // utf8
    std::string expr = "[\\u0080-\\uDB7F]+"; // utf8

    std::wstring wtest = from_utf8(test);
    std::wstring wexpr = from_utf8(expr);

    std::wregex we(wexpr);
    std::wsmatch wm;
    if(std::regex_search(wtest, wm, we))
    {
        std::cout << to_utf8(wm.str(0)) << '\n';
    }
}

Выход:

神谕

Замечания: Если вам нужноUTF библиотека преобразования, которую я использовалЭТОТ в приведенном выше примере.

Редактировать: Или вы можете использовать функции, приведенные в этом ответе:

Какие-нибудь хорошие решения для C ++ строкового кода и единицы кода?

 SexyBeast17 янв. 2018 г., 00:40
Отличный ответ, спасибо! Что это[\\u0080-\\uDB7F]+ диапазон покрытия?A-Z? В этом ключе, что было бы регулярным выражением для[a-zA-Z0-9]?
 Galik17 янв. 2018 г., 02:27
@SexyBeast Я только что скопировал этот диапазон из вопроса ОП. Но вы можете увидеть, что это покрывает здесь:idevelopment.info/data/Programming/character_encodings/... Также то, что вы написали, должно нормально работать в регулярных выражениях.

Ваш ответ на вопрос