SRC: Фильтр текста
От: Vampire Россия  
Дата: 22.09.02 14:59
Оценка: 7 (1)
Доброго времени суток.

Тут по ходу работки нарисовалать функция. Ну и решил ее выложить как есть.
Фильтр текста по шаблону 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()
Если долго мучиться что нибудь получится
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.