正则表达式不可打印的字节

时间:2016-07-01 13:56:52

标签: c++ regex unicode ascii

如何使用不可打印的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")。

2 个答案:

答案 0 :(得分:0)

这是解决方案:

std::regex r2e("[\x00-\x1F]\\{5\\}.*", 12, std::regex_constants::basic);

备注:

  1. 您需要在[ - ]范围内插入文字字符。

  2. {需要在基本正则表达式中进行转义。

  3. (.?)*.*具有相同的效果。

  4. 您必须使用此构造函数,该构造函数需要字符串的长度作为另一个参数,因为\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;
}