Boost Regex は、バイナリ テキスト内のバイナリ パターンの照合にも使用できます。ゼロバイトのような制御文字と混同されません。
コンストラクターと関数にはいくつかのオーバーロードがあります。たとえば、、null で終わる C 文字列、および反復子範囲のオーバーロードです。boost::regex
boost::regex_match
std::string
0 バイトにも一致させたいので、明らかに null で終わる 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 正規表現によって解釈されます:「16 進エスケープ シーケンスが途中で終了しました」。
したがって、例のように unsigned char 配列を使用するのが最も簡単な解決策です。