Как проверить символ на соответствие шаблону регулярного выражения в 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;
}