Доброго времени суток.
Тут по ходу работки нарисовалать функция. Ну и решил ее выложить как есть.
Фильтр текста по шаблону text1*text4*text9
Обрабатываеться только *
Область применения — таблицы, гриды и прочее с небольшей длиной теста.
Скоростью не блещет
но работает
extern "C" __declspec(dllexport) bool CmpFilterAndText(CString filter, CString text)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Ну это колдун поставил ;-)
// Приводим фильтр в нормальный вид
filter.Trim(_T("* ")); // Удаляем '*' и ' ' по краям
filter.Replace(_T(" *"), _T("*")); // и лишние пробелы в
filter.Replace(_T("* "), _T("*")); // в середине
// Для регистронезависимого поиска все в один регистр
filter.MakeLower();
text.MakeLower();
// Сразу отбрасываем очивидные результаты
if (text.Find(filter, 0) != -1)
return true;
for (int i = 0, int j = 0, int k=0; ; i++)
{
if ((filter[i] == _T('*')) || (filter[i] == 0))
{
k = text.Find(filter.Left(i), j);
if (k == -1)
return false; // ненашли ;-)
// Для произвольного порядка нахождения подстроки в строке
j = k + filter.Left(i).GetLength(); // закоментировать
if (filter[i] == 0)
break;
filter = filter.Mid(i + 1);
i = 0;
}
}
return true;
}
PS: Для Unicode не работает с рускими буквами
CString::MakeLower()