0

私は正規表現にかなり慣れていないので、自分の関数を自分のやりたいように動かすことができません。
長い文字列があり、そこから 3 つの変数を抽出したいと考えています。

私の文字列は次のようになります:

 Infoname/info :   
 Input_Device_Name GTape  Buffer_Size 16384 Acquisition_Event_Rate 163691.000000  
 Acquisition_Buffer_Rate 14873.333008 Acquisition_Succes_Rate 100.000000

私の目標は、163691.000000、14873.333008、および 100.000000 を 3 つの異なる変数に格納することです。

それを行うための最も速くて良い方法は何ですか?

ありがとう、
えお

4

2 に答える 2

1

次の正規表現を使用して検索できます。

"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]、行全体が含まれているため、必要がない限り無視できます。最後になりましたが、「スペース」文字クラスをダブルエスケープすることを忘れないでください。そうしないと、正規表現プロセッサに提示される前に、コンパイラによってすでに処理されます(またはエラーや警告が生成されます)。また、動作するコードに基づいていますが、これをコンパイルする時間がなかったことに注意してください

入力ファイルの末尾の先頭のスペースに注意し、役立つ場合は、とを使用^して行の先頭または末尾をそれぞれマークします。$

于 2012-07-11T10:06:35.190 に答える
0

[0-9\.]+結果が返される限り、検索するだけです。また、たとえば、16384必要のない変数として拒否したい場合は、すべての検索結果にドットが含まれているかどうかをテストします。

于 2012-07-11T09:46:01.977 に答える