Установить регулярное выражение boost из иностранного источника
Мне нужно разобрать журнал и у меня хорошо работает регулярное выражение, но теперь мне нужно установить регулярное выражение из конфигурационного файла, и вот проблема.
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 ответа
@sehe дает правильный ответ.
Если эта строка кода была проанализирована синтаксическим анализатором 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++.
На ваш прямой вопрос: попробуйте сохранить регулярное выражение без экранирования в файле конфигурации
(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\\\\"