RegEX Pattern HookSay

Сообщения
657
Реакции
229
Помог
11 раз(а)
Добрый вечер!
1)вопрос
Пытаюсь поймать слова через RegEX
Код:
public HookSay(iPlayer)
{
    new szData[ 256 ];
    read_args( szData, charsmax( szData ) );
    trim( szData );
    remove_quotes( szData );
   
   
    new iReturn;
   
   
    if( regex_match_c( szData, g_pPattern, iReturn ) != -2 )
    {
        if(iReturn == 0)
            server_print("сопоставление не найдено")
       
        new nNumber, nError[128], err
    //    regex_match_simple(szData, g_pPattern,  nNumber, nError, charsmax(nError), err)
        new Regex:rgxMatch
       
        new aDataTestPatternArray[DATA_SPRITES];
        regex_substr( g_pPattern, iReturn, szData, charsmax( szData ) );
        server_print("%d | %d | %s", iReturn, g_pPattern, szData);
        for (new j = 0; j < g_aArraySize; j++)
        {
            ArrayGetArray(g_aSpritesArray, j, aDataTestPatternArray)
            rgxMatch = regex_match(szData, aDataTestPatternArray[MODEL_NAME], nNumber, nError, charsmax(nError), "^^\/(.*)\/([imsx]*)$")
            if (rgxMatch >= REGEX_OK)
            {
                regex_free(rgxMatch)
                RegExFound(iPlayer, j);
                break;
            }
        }
    }
}
for (new j = 0; j < g_aArraySize; j++) - совсем не нравится данная реализация...

можно ли найти другой путь нежели проходит по циклам в аррай?

2) вопрос
правильная ли реализация?
1616439908392.png




структура Аррай;
1616439671740.png

Код:
parse
(
    szBuffer,
    aDataTestPatternArray[MODEL_NAME],         charsmax(aDataTestPatternArray[MODEL_NAME]),
    aDataTestPatternArray[SUB_MODEL],         charsmax(aDataTestPatternArray[SUB_MODEL]),
    aDataTestPatternArray[SPRITE_NAME],     charsmax(aDataTestPatternArray[SPRITE_NAME])
);
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
for (new j = 0; j < g_aArraySize; j++) - совсем не нравится данная реализация...
Если как надо работает, то правильная реализация ИМХО.
Можно для поиска множества подстрок в строке использовать Ахо-Корасик. Алгоритмически там очень быстро. Я по преклу реализовывал, но не замерял быстрее это или нет.
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
@irrumabo_me_nomen,есть где мануал по аха карасике в павне?
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
Limbooc, есть мануал по алгоритму с реализацией в с++ на хабре.
 
Сообщения
453
Реакции
255
Помог
9 раз(а)
зачем запоминать модельнэйм спрайтов? Прекеш возвращает ид прекешнутой модели, так проще жИ. На оленях где то лежит плагин антиспам с использованием регулярок, принцип тот же
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
зачем запоминать модельнэйм спрайтов? Прекеш возвращает ид прекешнутой модели, так проще жИ. На оленях где то лежит плагин антиспам с использованием регулярок, принцип тот же
модельнейм не имеет для меня значение, я в плане создание патернов
 
Сообщения
453
Реакции
255
Помог
9 раз(а)
Limbooc, это замечание не по теме, но место быть имеет
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
Сообщения
657
Реакции
229
Помог
11 раз(а)
index = ArrayFindString(mas, "EbGiK")

хммм.... проверю...спасибо
23 Мар 2021
malniata,

моя реализация следующая:

Код:
ArrayGetArray(g_aSpritesArray, j, aDataTestPatternArray)
            rgxMatch = regex_match(szData, aDataTestPatternArray[MODEL_NAME], nNumber, nError, charsmax(nError), "^^\/(.*)\/([imsx]*)$")
где szData - написанное сообщение,
aDataTestPatternArray[MODEL_NAME] - само слово в базе


index = ArrayFindString(mas, "EbGiK") -думаю не пойдет потому что слово все еще не найдено

regex_match - позволяет искать с корнем
23 Мар 2021
Код:
//Проходим по циклу всех слов в базе
for (new j = 0; j < g_aArraySize; j++)
{
    ArrayGetArray(g_aSpritesArray, j, aDataTestPatternArray)
    //szData - слово в HookSay+, aDataTestPatternArray[MODEL_NAME] - слово в моей базе
    rgxMatch = regex_match(szData, aDataTestPatternArray[MODEL_NAME], nNumber, nError, charsmax(nError), "^^\/(.*)\/([imsx]*)$")
    
    //True - если найдено
    if (rgxMatch >= REGEX_OK)
    {
        regex_free(rgxMatch)
        
        //Показываю определенный спрайт из Аррай
        RegExFound(iPlayer, j);
        break;
    }
}
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
у меня там база с 1000+ слов))) по циклу такое себе -_-
До 10к слов можете не париться. Даже самым медленным алгоритмом поиска на критических тестах это выполнится быстро.
к сожелению плохо читаю на с++, можно с вами связаться?
С какой целью? На павн перевести?) Там в боре и конечном автомате разобраться нужно. Пока сами не разберётесь никто не поможет.
А готовый код супирпреватный.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу