Регулярные выражения

Sidney31

Известный
Автор темы
1,132
385
Версия MoonLoader
.026-beta
Здравствуйте.
Хочу, чтобы при обнаружении в строке двух переменных запускался некий сценарий.
Пробовал по-разному, и с регулярками, и без, но никак не получилось. Вот, последнее, на чём остановился.
Lua:
...
function sampev.onServerMessage(color, text)
    myvip = '['..arr[vip.v+1]..']'
    mynick = nick.v..'['
    if string.find(text, (myvip..' '..mynick)) then
        timer()
    end
end
...
Искать нужно строку следующего вида:
Screenshot_4.png

где 'PREMIUM' - переменная myvip,
'Sidney_Vandal' - переменная mynick.
Спасибо за помощь.
 
Решение
[01:00:43] {F345FC}[PREMIUM] {FFFFFF}Nick_Name[1]: реклама
Lua:
local vipStatus = "PREMIUM"
local name = "Dolboyob"
if text:find("%{......%}%["..vipStatus.."%] %{......%}"..name.."%[%d+%]") then 
--TEXT
end
p.s. хз что у тебя за arr[vip.v+1] кнч, но я уверен что что-то не то)
Экранизация многих объектов необходима по типу скобок фигурных или нет, но они есть в тексте. [ ( { } ) ] перед каждой %. т.к. они иначе воспринимаются как регулярка, точка в регулярке - любой символ.

Sidney31

Известный
Автор темы
1,132
385
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    local text = text:gsub('{......}', '')
    if text:find('%[(.+)%] (.+)%[%d+%]: (.+)') then
        local status, name, id, msg = text:match('%[(.+)%] (.+)%[%d+%]: (.+)')
    end
end
Блин, я хочу немного другое.
Указываю свой статус вип, указываю ник.
Далее, если строка содержащая 'PREMIUM' (статус) и 'Sidney_Vandal' (ник) найдена - запускается другая функция.
У меня проблема с поиском строки. Пишу следующее:
Lua:
function sampev.onServerMessage(color, text)
    if string.find(text, ('['..arr[vip.v+1]..'] '..nick.v'[')) then
        timer()
В теории, при появлении строки с '[PREMIUM] Sidney_Vandal[' скрипт перейдёт к выполнению функции 'timer'.
Но на практике этого не происходит.
Решил проверить, может в искомой строке что-то не так, сделал тестовую функцию:
Lua:
function test()
    sampAddChatMessage('['..arr[vip.v+1]..'] '..nick.v..'[', -1)
end

1646947660749.png


Строки одинаковы, но функция не замечает этого.
 

awserver

Участник
55
23
Блин, я хочу немного другое.
Указываю свой статус вип, указываю ник.
Далее, если строка содержащая 'PREMIUM' (статус) и 'Sidney_Vandal' (ник) найдена - запускается другая функция.
У меня проблема с поиском строки. Пишу следующее:
Lua:
function sampev.onServerMessage(color, text)
    if string.find(text, ('['..arr[vip.v+1]..'] '..nick.v'[')) then
        timer()
В теории, при появлении строки с '[PREMIUM] Sidney_Vandal[' скрипт перейдёт к выполнению функции 'timer'.
Но на практике этого не происходит.
Решил проверить, может в искомой строке что-то не так, сделал тестовую функцию:
Lua:
function test()
    sampAddChatMessage('['..arr[vip.v+1]..'] '..nick.v..'[', -1)
end

Посмотреть вложение 139357

Строки одинаковы, но функция не замечает этого.
потому что onservermessage принимает только серверные сообщения
 

Sidney31

Известный
Автор темы
1,132
385
потому что onservermessage принимает только серверные сообщения
По примеру попробовал через text:find:

if text:find('%['..arr[vip.v+1]..'%] '..nick.v..'%[$d+%]') then wait(250) timer():
if text:find('%['..arr[vip.v+1]..'%] '..nick.v..'%[$d+%]') then
    wait(250)
    timer()
Но тоже ничего. Ошибка в регулярках?
 

T1cKz

Известный
596
246
По примеру попробовал через text:find:

if text:find('%['..arr[vip.v+1]..'%] '..nick.v..'%[$d+%]') then wait(250) timer()'%['..arr[vip.v+1]..'%] '..nick.v..'%[$d+%]') then wait(250) timer():
if text:find('%['..arr[vip.v+1]..'%] '..nick.v..'%[$d+%]') then
    wait(250)
    timer()
Но тоже ничего. Ошибка в регулярках?
дай выгрузку строки с чатлога этой строки что тебе нужно ловить(где есть премиум)
 

T1cKz

Известный
596
246
[01:00:43] {F345FC}[PREMIUM] {FFFFFF}Nick_Name[1]: реклама
Lua:
local vipStatus = "PREMIUM"
local name = "Dolboyob"
if text:find("%{......%}%["..vipStatus.."%] %{......%}"..name.."%[%d+%]") then 
--TEXT
end
p.s. хз что у тебя за arr[vip.v+1] кнч, но я уверен что что-то не то)
Экранизация многих объектов необходима по типу скобок фигурных или нет, но они есть в тексте. [ ( { } ) ] перед каждой %. т.к. они иначе воспринимаются как регулярка, точка в регулярке - любой символ.
 
  • Нравится
Реакции: Sidney31

Sidney31

Известный
Автор темы
1,132
385
...lua:60: attempt to index global 'text' (a nil value)
60 строка выделена синим

Lua:
function main()
    while not isSampAvailable() do wait(200) end
    while true do
        wait(0)
        nick.v = ini.main.nick
        vip.v = ini.main.vip
        time.v = ini.main.time

        local vipstatus = arr[vip.v+1]
        local name = nick.v
        if text:find("%{......%}%["..vipstatus.."%] %{......%}"..name.."%[%d+%]") then
            timer()
        end
    end
end

----------
Проблема решена. Добавил function sampev.onServerMessage(color, text).
Спасибо за помощь.
 
Последнее редактирование: