1

ログを解析する必要があり、正常に動作する正規表現を使用していますが、構成ファイルから正規表現を設定する必要があり、ここに問題があります。

int logParser()
{
  std::string bd_regex; // this reads from config in other part of program
  boost::regex parsReg;
  //("(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])");
  try
  {
    parsReg.assign(bd_regex, boost::regex_constants::icase);  
  }
  catch (boost::regex_error& e)
  {
    cout << bd_regex << " is not a valid regular expression: \""
         << e.what() << "\"" << endl;
  }

  cout << parsReg << endl;
  // here it looks exactly like:
  // "("(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])");"

  int count=0;
  ifstream in;

  in.open(bd_log_path.c_str());

  while (!in.eof()) 
  {
    in.getline(buf, BUFSIZE-1);
    std::string s = buf;
    boost::smatch m;

    if (boost::regex_search(s, m, parsReg)) // it doesn't obey this "if"
    {
      std::string name, diagnosis;
      name.assign(m[2]);
      diagnosis.assign(m[4]);

      strcpy(bd_scan_results[count].file_name, name.c_str());
      strcpy(bd_scan_results[count].out,  diagnosis.c_str());
      strcat(bd_scan_results[count].out,  " ");

      count++;
      } 
    }
  return count;
}

そして、構成変数から設定しようとしたときに同じ正規表現が機能しない理由が本当にわかりません。

どんな助けでも大歓迎です(:

4

2 に答える 2

0

あなたの直接の質問について:構成ファイルにエスケープなしで正規表現を保存してみてください

(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])

その上、私はあなたがここでバックスラッシュを一致させたかったように見えると言わなければなりません:

C:.tmp.bd.

構成に次のように記述します。

C:\\tmp\\bd\\

C ++文字列リテラルでは、

"C:\\\\tmp\\\\bd\\\\"

于 2011-11-17T23:28:21.383 に答える
0

@seheは正しい答えを出します。

このコード行が C++ パーサーによって解析された場合、
str = "(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])";

エスケープ文字\\を単に escape:にエスケープ解除し\
それを変数「str」に割り当てます。変数「str」内では、次のようになります。
(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])

しかし、このテキストをファイルから読んでいるので、言語的な意味での解析はありません。
生のテキスト行である「str」に割り当てています。C++ パーサーによって前処理されていない行。

于 2011-11-18T00:56:47.303 に答える