ускорить поиск регулярных выражений с MFC CString - PullRequest
0 голосов
/ 20 сентября 2010

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

#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 Ответ

1 голос
/ 22 сентября 2010

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

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

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

...