Помогите с регулярным выражением

3211Marlon1123

Участник
Автор темы
130
12
Версия MoonLoader
.026-beta
Всем привет. Есть такая вот таблица, с ней всё норм, это не переменные.

Lua:
0 = {1982.40625, -1718.8854980469, 17}
1 = {1982.9914550781, -1682.8572998047, 17}
2 = {2015.8630371094, -1629.9202880859, 14}

Помогите сделать для каждой строки регулярное выражение. Разберём на примере первой строки. Первая цифра - 0. Это будет переменная 'on', она бывает только положительной и целой. Второе число - десятичная дробь, она может быть как отрицательным так и нет. Третье число тоже самое, что и второе, но нужно учесть, что после запятой есть пробел (его потом методом .gsub убираем), а третье число только целое, но может быть отрицательным и положительным, пробел после запятой тоже учесть. У меня получилась регулярка, вроде правильная, но не робит.
=:
if response:find(on .. '%s%=%s%{(.+%d+)%,(.+%d+)%,(.+%d+)%}') then
                            sampAddChatMessage(on, main_color)
                            cordxgs, cordygs, cordzgs = response:match(on .. '%s%=%s%{(.+%d+)%,(.+%d+)%,(.+%d+)%}')
                            cordx = string.gsub(cordxgs, " ", "")
                            cordy = string.gsub(cordygs, " ", "")
                            cordz = string.gsub(cordzgs, " ", "")
                            sampAddChatMessage(cordx, main_color)
                            sampAddChatMessage(cordy, main_color)
                            sampAddChatMessage(cordz, main_color)
end

sa-mp-214.png

По задумке оно должно читать строку с определённым номером (выше пример с номером 0). Если она будет найдена, то будет считывать координаты X,Y,Z соответственно (числа по порядку в фигурных скобках) Потом по порядку сверху вниз новой строкой выводится номер и координаты x,y,z. А мне вот такую кашу (пример выше на фото) выдаёт, читает лишнее вообще.

help
 
Последнее редактирование:
Решение
Забыл ответить в тот раз.
Проверил с кучкой твоих коорд, всё работает. Надеюсь переменная on не пустая у тебя будет.
Lua:
if response:find(on .. " = {[-%d.]+, [-%d.]+, [-%d.]+}") then
    local x,y,z = response:gsub("%s", ""):match(on.."={([-%d.]+),([-%d.]+),([-%d.]+)}")
    print(x,y,z)
end

3211Marlon1123

Участник
Автор темы
130
12
Lua:
if response:find(on .. " = {[-%d.]+, [-%d.]+, [-%d.]+}") then -- если прям строго придерживаться
    local x,y,z = response:gsub("%s", ""):match("{(.+),(.+),(.+)}")
    print(x,y,z)
end
Та же проблема, что и на последнем скрине. Почему-то читаются все строки после той, которой нужно(
Снизу код прикреплю. По ссылке можете перейти, посмотреть эти типо "переменные"

Lua:
function cmd_http()
    httpRequest('https://text-host.ru/raw/bez-zagolovka-1056', nil, function(response, code, headers, status)
        if response then
            print(url, 'OK', status)
                        print(u8:decode(response))
                        if response:find(on .. '%s%=%s%{(.+%d+)%,(.+%d+)%,(.+%d+)%}') then
                            sampAddChatMessage(on, main_color)
                            cordxgs, cordygs, cordzgs = response:match(on .. '%s%=%s%{(.+%d+)%,(.+%d+)%,(.+%d+)%}')
                            cordx = string.gsub(cordxgs, " ", "")
                            cordy = string.gsub(cordygs, " ", "")
                            cordz = string.gsub(cordzgs, " ", "")
                            sampAddChatMessage(cordx, main_color)
                            sampAddChatMessage(cordy, main_color)
                            sampAddChatMessage(cordz, main_color)
                        end

        else
            print(url, 'Error', code)
        end
    end)
end

function httpRequest(request, body, handler) -- copas.http
    -- start polling task
    if not copas.running then
        copas.running = true
        lua_thread.create(function()
            wait(0)
            while not copas.finished() do
                local ok, err = copas.step(0)
                if ok == nil then error(err) end
                wait(0)
            end
            copas.running = false
        end)
    end
    -- do request
    if handler then
        return copas.addthread(function(r, b, h)
            copas.setErrorHandler(function(err) h(nil, err) end)
            h(http.request(r, b))
        end, request, body, handler)
    else
        local results
        local thread = copas.addthread(function(r, b)
            copas.setErrorHandler(function(err) results = {nil, err} end)
            results = table.pack(http.request(r, b))
        end, request, body)
        while coroutine.status(thread) ~= 'dead' do wait(0) end
        return table.unpack(results)
    end
end
 
Последнее редактирование:

PanSeek

t.me/dailypanseek
Всефорумный модератор
899
1,743
Напиши мне в вк, помогу
С каких пор мы помогаем в ВК или на других источниках?
Проблема не такая большая, чтобы ее решать в других местах. Возможно такая проблема будет у кого-то еще. Форум для этого дает все, нежели ВК.

P.S. Да и в ВК нужно присылать скрипт или присылать текстом без табуляции, там нет форматирования текста "код", как например, в том же телеграме.

@3211Marlon1123 если проблема решена, укажите решение.
 
  • Нравится
Реакции: 3211Marlon1123

Salvatore_Ferrari

Известный
429
239
С каких пор мы помогаем в ВК или на других источниках?
Проблема не такая большая, чтобы ее решать в других местах. Возможно такая проблема будет у кого-то еще. Форум для этого дает все, нежели ВК.

P.S. Да и в ВК нужно присылать скрипт или присылать текстом без табуляции, там нет форматирования текста "код", как например, в том же телеграме.

@3211Marlon1123 если проблема решена, укажите решение.
Иди лесом, высрал тут никому ненужное мнение

Всем привет. Есть такая вот таблица, с ней всё норм, это не переменные.

Lua:
0 = {1982.40625, -1718.8854980469, 17}
1 = {1982.9914550781, -1682.8572998047, 17}
2 = {2015.8630371094, -1629.9202880859, 14}

Помогите сделать для каждой строки регулярное выражение. Разберём на примере первой строки. Первая цифра - 0. Это будет переменная 'on', она бывает только положительной и целой. Второе число - десятичная дробь, она может быть как отрицательным так и нет. Третье число тоже самое, что и второе, но нужно учесть, что после запятой есть пробел (его потом методом .gsub убираем), а третье число только целое, но может быть отрицательным и положительным, пробел после запятой тоже учесть. У меня получилась регулярка, вроде правильная, но не робит.
=:
if response:find(on .. '%s%=%s%{(.+%d+)%,(.+%d+)%,(.+%d+)%}') then
                            sampAddChatMessage(on, main_color)
                            cordxgs, cordygs, cordzgs = response:match(on .. '%s%=%s%{(.+%d+)%,(.+%d+)%,(.+%d+)%}')
                            cordx = string.gsub(cordxgs, " ", "")
                            cordy = string.gsub(cordygs, " ", "")
                            cordz = string.gsub(cordzgs, " ", "")
                            sampAddChatMessage(cordx, main_color)
                            sampAddChatMessage(cordy, main_color)
                            sampAddChatMessage(cordz, main_color)
end

Посмотреть вложение 120902
По задумке оно должно читать строку с определённым номером (выше пример с номером 0). Если она будет найдена, то будет считывать координаты X,Y,Z соответственно (числа по порядку в фигурных скобках) Потом по порядку сверху вниз новой строкой выводится номер и координаты x,y,z. А мне вот такую кашу (пример выше на фото) выдаёт, читает лишнее вообще.

help
Скинь мне полностью скрипт, и пожалуйста скажи какую библиотеку используешь для ассинхронного http запроса
 

Hatiko

Известный
Проверенный
1,469
610
Забыл ответить в тот раз.
Проверил с кучкой твоих коорд, всё работает. Надеюсь переменная on не пустая у тебя будет.
Lua:
if response:find(on .. " = {[-%d.]+, [-%d.]+, [-%d.]+}") then
    local x,y,z = response:gsub("%s", ""):match(on.."={([-%d.]+),([-%d.]+),([-%d.]+)}")
    print(x,y,z)
end
 
  • Нравится
Реакции: 3211Marlon1123

3211Marlon1123

Участник
Автор темы
130
12
Забыл ответить в тот раз.
Проверил с кучкой твоих коорд, всё работает. Надеюсь переменная on не пустая у тебя будет.
Lua:
if response:find(on .. " = {[-%d.]+, [-%d.]+, [-%d.]+}") then
    local x,y,z = response:gsub("%s", ""):match(on.."={([-%d.]+),([-%d.]+),([-%d.]+)}")
    print(x,y,z)
end
Спасибо, раньше такое же писал, on не был пустой. Выводило всё подряд. Ну, главное разобрался)) Спасибо <3
 
  • Нравится
Реакции: Hatiko