如何使用不可打印的Unicode或ASCII字节匹配正则表达式?
char cData[1024] = { 0 };
memcpy(cData, "\x00\x04\x02\x08\x00hello thats it", 19);
std::regex r2e("([\\x00-\\x1F]){5}(.?)*", std::regex_constants::basic);
if (std::regex_search((char*)cData, cData+19, r2e))
printf("ok");
else
printf("nok");
我的例子不起作用(打印" nok")。
答案 0 :(得分:0)
这是解决方案:
std::regex r2e("[\x00-\x1F]\\{5\\}.*", 12, std::regex_constants::basic);
备注:强>
您需要在[ - ]
范围内插入文字字符。
{
需要在基本正则表达式中进行转义。
(.?)*
与.*
具有相同的效果。
您必须使用此构造函数,该构造函数需要字符串的长度作为另一个参数,因为\x00
null char将结束字符串。
答案 1 :(得分:0)
这是解决方案。我使用了错误的'regex_constants'。
感谢Mike的帮助。但是,经过大量的调试尝试后,我发现其中一个工作正常!
#include <iostream>
#include <string>
#include <regex>
int main()
{
char cData[1024] = "\x00\x04\x02\x08\x01Haaaaa";// { 0 };
char cReg[] = "([\0-\x1F]{5})(.*)";
int aux[sizeof(cReg)];
for (int i = 0; i < sizeof(cReg); i++)
{
aux[i] = cReg[i];
}
std::match_results<char*> mc;
std::initializer_list<int> list(aux, aux + 14);
std::regex r2e(cReg,14, std::regex_constants::ECMAScript);
if (std::regex_match((char*)cData, cData+10, mc, r2e, std::regex_constants::match_default)) {
for (auto it : mc)
std::cout << it.str().c_str() << std::endl;
}
else {
std::cout << "NOK" << std::endl;
}
std::string name;
std::cin >> name;
}