установить регулярное выражение повышения из внешнего источника - PullRequest
1 голос
/ 18 ноября 2011

Мне нужно разобрать журнал, и я хорошо работаю с регулярным выражением, но теперь мне нужно установить регулярное выражение из конфигурационного файла, и вот проблема.

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;
}

и я действительно не знаю, почему тот же regex не работает, когда я пытался установить его из переменной config.

Буду признателен за любую помощь (:

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

@ Сехе дает правильный ответ.

Если эта строка кода была проанализирована синтаксическим анализатором c ++,
str = "(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])";

это приведет к экранированию экранирующего символа \\ в просто экранирование: \, затем
присвойте его переменной 'str'. Внутри переменной 'str' теперь это выглядит так:
(C:.tmp.bd.*?)+(([a-zA-Z0-9_]+\.)+[a-zA-Z]{2,4})+(.+[a-zA-Z0-9_])

Но вы читаете этот текст из файла, синтаксический анализ в языковом смысле отсутствует.
Вы назначаетесь на «str», необработанную строку текста. Строка, которая не была предварительно обработана синтаксическим анализатором c ++.

0 голосов
/ 18 ноября 2011

По вашему прямому вопросу: попробуйте сохранить регулярное выражение без экранирования в файле конфигурации

(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\\\\"

...