Как проверить символ на соответствие шаблону регулярного выражения в c++?

В js коде у меня было подобное, когда мне нужно было проверить символ на соответствие регулярному выражению:

/[\w$_~]/.test(char)

В c++ же я столкнулся с тем, что функция regex_match работает только с итераторами, коим char не является. Я пробовал такое:

 char s[1] = {ch};
 printf("%s\n", s);
 std::regex_match(s, std::regex("[\w$_~]"));

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


Ответы (1 шт):

Автор решения: Maxim

Нужно проверять строку, в вашем случае это будет строка с одним символом, например, массив из символа и завершающего нуля, массив из одного символа или стандартная строка из одного символа

#include <iostream>
#include <regex>
#include <algorithm>
#include <iterator>
#include <iomanip>
#include <string>

bool check_char1(char ch) {
    char s[]{ch, 0};
    return std::regex_match(s, std::regex(R"([\w$_~])"));
}

bool check_char2(char ch) {
    char s[]{ch};
    return std::regex_match(std::begin(s), std::end(s), std::regex(R"([\w$_~])"));
}

bool check_char3(char ch) {
    std::string s{ch};
    return std::regex_match(s, std::regex(R"([\w$_~])"));
}

bool check_char4(char ch) {
    std::string s{ch};
    return std::regex_match(std::begin(s), std::end(s), std::regex(R"([\w$_~])"));
}

int main()
{
    const char str[]{"Hello World!"};
    std::for_each(std::begin(str), std::end(str), [](auto i) {
       std::cout<<i<<"(0x"<<std::hex<<std::setw(2)<<std::setfill('0')
       <<static_cast<unsigned int>(i)<<"): "<<std::boolalpha
       <<check_char1(i)<<", "
       <<check_char2(i)<<", "
       <<check_char3(i)<<", "
       <<check_char4(i)<<std::endl;
    });

    return 0;
}

https://en.cppreference.com/w/cpp/regex/regex_match

→ Ссылка