2010-09-20 4 views
0

У меня возникла проблема с использованием регулярного выражения Boost с MFC CString. Регулярное выражение очень просто: он должен проверить, заканчивается ли строка с именем dll, которое я ищу. В приведенном ниже коде CString Path есть DLL, которую я ищу, но я не знаю, почему редикс терпит неудачу. Uisng ReleaseBuffer увеличивает размер буфера, поэтому для параметра Длина пути задано значение MAX_PATH. Вы знаете, почему это неправильно? Я сделал много попыток, но всегда терпел неудачу.сбой поиска регулярных выражений с помощью MFC CString

#include <boost/regex/mfc.hpp> 
const CString ValuesDLLName = _T("MyDll.dll"); 
boost::tregex EndsWithRegex(_T(".+MyDll.dll\s*$")); 

//boost::tregex EndsWithRegex1(_T("^.+Values\.dll\\s*$")); // not working 
//boost::tregex EndsWithRegex2(_T("^.+Values\.dll\s*$")); // not working 
//boost::tregex EndsWithRegex3(_T("^.+Values.dll\s*$")); // not working 
//boost::tregex EndsWithRegex4(_T("^.+Values.dll\\s*$")); // not working 
//boost::tregex EndsWithRegex5(_T("^.+Values\.dll\\s*$"),boost::regex::perl); // not working 
//boost::tregex EndsWithRegex6(_T("^.+Values\.dll\s*$"),boost::regex::perl); // not working 
//boost::tregex EndsWithRegex7(_T("^.+Values.dll\s*$"),boost::regex::perl); // not working 
//boost::tregex EndsWithRegex8(_T("^.+Values.dll\\s*$") ,boost::regex::perl); // not working 

CString Path; 
boost::tmatch What; 

_tsearchenv(ValuesDLLName, _T("PATH"), Path.GetBufferSetLength(260)); 
Path.ReleaseBuffer(260); 

bool endsWithDllName = boost::regex_search(Path, What, EndsWithRegex); 

ответ

1

Ваши обратные косые должны быть в два раза выше, потому что C++ проглотит первый в качестве экранирующего символа. Попробуйте

boost::tregex EndsWithRegex(_T("^.+Values\\.dll\\s*$")); 

Кроме того, я думаю, что вы используете ReleaseBuffer неправильно. Параметр должен быть фактическим размером строки, которая была возвращена, иначе конец строки может содержать мусор. Если вы можете зависеть от того, что строка завершена с нулевым значением, вы всегда можете использовать -1 для параметра или оставить ее, поскольку она по умолчанию.