Boost Regex 也可用于匹配二进制文本中的二进制模式。它不会被零字节等控制字符混淆。
构造函数和函数有几个 重载,例如那些采用 a ,一个以空结尾的 C 字符串 - 和 - 用于迭代器范围的重载。boost::regex
boost::regex_match
std::string
由于我们还想匹配零字节,我们显然不能使用以空结尾的 C 字符串。使用std::string
是可能的(因为它可能包含零字节) - 但是复制模式和文本只是为了搜索是浪费的。
迭代器范围非常适合这个用例。
例子:
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
int main(int argc, char **argv)
{
const unsigned char expr[] = {
'.', '*', 0x08, 0x00, 0x27, 0x47, 0x6b, 0xd4, '.', '*' } ;
const unsigned char data[] = {
0x12, 0x08, 0x00, 0x27, 0x47, 0x6b, 0xd4, 0x08 };
boost::regex regex(reinterpret_cast<const char*>(expr),
reinterpret_cast<const char*>(expr) + sizeof expr);
boost::cmatch what;
if (boost::regex_match(reinterpret_cast<const char*>(data),
reinterpret_cast<const char*>(data) + sizeof data, what, regex))
cout << "match!\n";
else
cout << "no match\n";
return 0;
}
通过例如编译:
$ g++ regex.cc -o regex -Wall -g -lboost_regex
示例输出:
$ ./regex
match!
s 可能看起来很危险,reinterpret_cast
但它都是已定义的行为。请注意,将数组定义为data
数组char
并不是一个好主意,因为 char 可能是有符号或无符号的,具体取决于体系结构。当它被签署时,会0xd4
产生这个错误:
error: narrowing conversion of ‘212’ from ‘int’ to ‘char’
inside { } [-Wnarrowing]
当尝试"\xd4"
在字符串文字中使用类似的东西时,预计会出现类似的问题。使用双反斜杠,转义由 Boost 正则表达式解释,它很容易像这样混淆:“十六进制转义序列过早终止”。
因此,仅使用示例中的无符号字符数组是最简单的解决方案。