Проясните за gsub

romanespit

Участник
Автор темы
23
9
Версия MoonLoader
Другое
Решил попробовать себя в луа, начал с основ и сразу встал. Пытался дебажить, но не понимаю, почему один и тот же код обрабатывает 2 строки по разному. Их отличие в наличии скобок в исходных данных. Задача: из исходной строки разделить данные, разделенные символом |.
Накидал для дебага 2 цикла:
Lua:
local text1= "Ivan_Pupkin | $5000 | Los Santos | Мэрия | Пешком"
local text2= "Ivan_Pupkin(1) | $5000 | Los Santos | Мэрия | Пешком"
local n = 1
local k = 0
local cutted
print("Строка: "..text1)
for i in text1:gmatch ("|") do
    k = k+1
    print("--------------------")
    print("Итерация №".. k)
    n = text1:find("|") -- 19
    print("New N="..n)
    cutted = text1:sub(1,n+1)
    print("Вырезаем: "..cutted)
    print("До вырезки: "..text1)
    text1 = string.gsub(text1,cutted,"",1)
    print("После вырезки: "..text1)
    print("N="..n)
end;
n = 1
k = 0
print("\nСтрока2: "..text2)
for i in text2:gmatch ("|") do
    k = k+1
    print("--------------------")
    print("Итерация №".. k)
    n = text2:find("|") -- 19
    print("New N="..n)
    cutted = text2:sub(1,n+1)
    print("Вырезаем: "..cutted)
    print("До вырезки: "..text2)
    text2 = string.gsub(text2,cutted,"",1)
    print("После вырезки: "..text2)
    print("N="..n)
end;
Таким образом из строки Ivan_Pupkin | $5000 | Los Santos | Мэрия | Пешком все делается правильно, но как только в строке появляются скобки - Ivan_Pupkin(1) | $5000 | Los Santos | Мэрия | Пешком - функция gsub по не известной мне причине отказывается выполнять функцию.
1691453888826.png
1691453906844.png
Подскажите, почему так происходит? Вероятно я что-то упустил, но в упор не вижу🥲
 
Последнее редактирование:

kyrtion

Известный
1,171
433
Тут в документации все есть, прочитаешь их, от вас требуется знание по иностранному языку.

Если лень, то кратко покажу.
Lua:
local text = 'Моя цена: 51 руб.'
-- а чтобы убрать ' руб.', то воспользуем так:
local changed_text = text:gsub('%sруб%.', '') -- 'Моя цена: 51'

local text2rub = 'Старая цена: 51 руб. | Новая цена: 61 руб.'
-- а чтобы заменить только один раз, то воспользуем так:
local changed_text2rub = text2rub:gsub('%sруб%.', '', 1) -- 'Старая цена: 51 | Новая цена: 61 руб.'

Также советую поиграться с Lua на сайте где компилируют Lua.
Также настоятельно советую изучить Lua начиная с синтаксиса и потянуть до создании библиотек. Позже узнаешь как это исправить и понимаешь смысл эта система.
 
Последнее редактирование:
  • Нравится
Реакции: romanespit

wojciech?

Известный
Проверенный
404
359
из исходной строки разделить данные, разделенные символом |.
Для этой цели лучше подойдет string.gmatch. Если планируется замена каких-то данных из строки, то подойдет string.gsub с итератором (возвращаемое значение из функции для итератора будет заменять найденный шаблон)

Lua:
local text = "Ivan_Pupkin(1) | $5000 | Los Santos | Мэрия | Пешком"
local pattern = "%s*([^|]+)%s*"
-- %s* указывает, что перед или после нужного текста могут быть (или не быть) пробелы, которые нам не интересны
-- [^|]+ шаблон, указывающий, что нам нужно найти все символы, отличные от знаков разделителя
-- () для шаблона выше нужно, чтобы именно этот участок, без учета пробелов, передался в итератор

for value in string.gmatch(text, pattern) do
  print(value)
end

print()

string.gsub(text, pattern, function(value)
  print(value)
end)

1691500478392.png
 
  • Нравится
Реакции: romanespit