RegEx + Array

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
657
Реакции
229
Помог
11 раз(а)
Добрый день!

Прошу вашей содействие, попытался сделать следующие, сохранить каждое слово через RegEx, полученный результат фильтровать через Array

Проблема в том что с конфигурационного файла Pattern(RegEx) берет последний слова на файле,

Знающие люди подскажите как правильно занести данные в патерн и сделать возможность сверка слов через Array

Код:
#include < amxmodx >
#include < amxmisc >
#include < regex >

new Regex:g_pPattern = REGEX_PATTERN_FAIL;

new Regex:g_pPatternFlags;

new Array:g_aTest;
new g_aTestSize;

enum _:DATA_COSTUMES_PRECACHE
{
    MODEL_NAME[32],
    SUB_MODEL[4]
}



public plugin_cfg()
{
    new szCfgDir[64], szCfgFile[128];
    get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
    formatex(szCfgFile, charsmax(szCfgFile), "%s/pattern_test.ini", szCfgDir);
    if(file_exists(szCfgFile))
    {
        new aDataTestPatternArray[DATA_COSTUMES_PRECACHE], szBuffer[256], iLine, iLen;
        g_aTest = ArrayCreate(DATA_COSTUMES_PRECACHE);
        new iReturn;
        new szFlags[ 5 ];
        while(read_file(szCfgFile, iLine++, szBuffer, charsmax(szBuffer), iLen))
        {
            if(!iLen || szBuffer[0] == ';') continue;
            parse
            (
                szBuffer,
                aDataTestPatternArray[MODEL_NAME],         charsmax(aDataTestPatternArray[MODEL_NAME]),
                aDataTestPatternArray[SUB_MODEL],         charsmax(aDataTestPatternArray[SUB_MODEL])
            );
            
            if( regex_match_c( aDataTestPatternArray[MODEL_NAME], g_pPatternFlags, iReturn ) > 0 )
            {
                regex_substr( g_pPatternFlags, 1, aDataTestPatternArray[MODEL_NAME], charsmax( aDataTestPatternArray[MODEL_NAME] ) );
                regex_substr( g_pPatternFlags, 2, szFlags, charsmax( szFlags ) );
            }
            
            new szError[ 128 ];
            g_pPattern = regex_compile( aDataTestPatternArray[MODEL_NAME], iReturn, szError, charsmax( szError ), szFlags );
            
            
            
            if( g_pPattern == REGEX_PATTERN_FAIL )
            {
                server_print("Error with pattern: %s", szError );
            }
            else
            {
                ArrayPushArray(g_aTest, aDataTestPatternArray);
            }
            
        }
        g_aTestSize = ArraySize(g_aTest);
    }

}
public plugin_init( )
{
    new iReturn, szError[ 128 ];
    g_pPatternFlags = regex_compile( "^^\/(.*)\/([imsx]*)$", iReturn, szError, charsmax( szError ) );
    
    if( g_pPatternFlags == REGEX_PATTERN_FAIL )
    {
        log_amx( "Error creating pattern for patterns: %s", szError );
    }

    register_clcmd("say","HookSay");
    register_clcmd("say_team","HookSay");
}

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 )
    {
        console_print( iPlayer, "%d matches", iReturn );
        
        for( new i = 0; i < iReturn; i++ )
        {
            regex_substr( g_pPattern, i, szData, charsmax( szData ) );

            new aDataTestPatternArray[DATA_COSTUMES_PRECACHE]
            for (new i = 0; i < g_aTestSize; i++)
            {
                ArrayGetArray(g_aTest, i, aDataTestPatternArray)
                
                if(equal(szData, aDataTestPatternArray[MODEL_NAME]))
                {
                    server_print("Pattern Found: %s | %d", aDataTestPatternArray[MODEL_NAME], aDataTestPatternArray[SUB_MODEL]);
                    break;
                }
            }
        }
    }
    
}
Код:
"Test1" "1"
"Desk1" "1"
"Pesk1" "2"
15 Янв 2021
Другими словами чего бы я не написал из трех слов, то вернет только последние слово, т.е. "Pesk1" "2"
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
разобрался, прошу закрыть
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
Pokemoshka, Алгоритм Ахо-Карасика на минималке))

Код:
public HookSay(iPlayer)
{
    if(!is_user_alive(iPlayer))
        return;
        
    new szData[ 256 ];
    read_args( szData, charsmax( szData ) );
    trim( szData );
    remove_quotes( szData );
    
    
    new iReturn;
    
    if( regex_match_c( szData, g_pPattern, iReturn ) != -2 )
    {
        new Regex:rgxMatch
        new nNumber, nError[128]
        new aDataTestPatternArray[DATA_COSTUMES_PRECACHE];
        
        for (new j = 0; j < g_aTestSize; j++)
        {
            ArrayGetArray(g_aTest, 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;
            }
        }
    }
}
 
Статус
В этой теме нельзя размещать новые ответы.

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

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