次の正規表現を使用して検索できます。
"Input_Device_Name\s+GTape\s+Buffer_Size\s+[0-9.]+\s+Acquisition_Event_Rate\s+([0-9.]+)\s+Acquisition_Buffer_Rate\s+([0-9.]+)\s+Acquisition_Succes_Rate\s+([0-9.]+)"
これは、テキストが同じままであり、数値が常にこの形式である(つまり、正であり、指数形式ではない)と仮定して、3つの値をキャッチする必要があります。最後の3つの数値のみが、それらを括弧で囲むことによってキャプチャされることに注意してください。
ブースト正規表現を使用する場合は、次のようにすることができます。
#include <boost/regex.hpp>
..。
boost::smatch what;
static const boost::regex pp("Input_Device_Name\\s+GTape\s+Buffer_Size\\s+[0-9.]+\\s+Acquisition_Event_Rate\\s+([0-9.]+)\\s+Acquisition_Buffer_Rate\\s+([0-9.]+)\\s+Acquisition_Succes_Rate\\s+([0-9.]+)");
if ( boost::regex_match(inputTextString, what, pp) )
{
if ( what.size() == 4 )
{
double d1 = strtod(static_cast<const string&>( what[1] ).c_str(), NULL, 0);
double d2 = strtod(static_cast<const string&>( what[2] ).c_str(), NULL, 0);
double d3 = strtod(static_cast<const string&>( what[3] ).c_str(), NULL, 0);
// These are your doubles, do some stuff with them.
}
}
ここinputTextString
には、解析するテキストの行が含まれているため、これがファイルsayからのものである場合は、このコードをループに配置する必要があります。変数は一致するすべてのテキストのwhat
ベクトルですがwhat[0]
、行全体が含まれているため、必要がない限り無視できます。最後になりましたが、「スペース」文字クラスをダブルエスケープすることを忘れないでください。そうしないと、正規表現プロセッサに提示される前に、コンパイラによってすでに処理されます(またはエラーや警告が生成されます)。また、動作するコードに基づいていますが、これをコンパイルする時間がなかったことに注意してください
入力ファイルの末尾の先頭のスペースに注意し、役立つ場合は、とを使用^
して行の先頭または末尾をそれぞれマークします。$