Вопрос по регулярке и gsub

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,934
11,701
Версия MoonLoader
.026-beta
Как сделать так, что бы заменялось только отдельное слово?
Например у меня есть 2 строки:
Lua:
local one = 'niggers'
local two = 'gg - good game'
как с помощью string.gsub заменить "gg" например на "hello world", но сделать это так, что бы заменилось только "gg" во второй строке? (что бы заменялись только отдельные слова)
вариант %f[%a]gg%f[%A] не подходит

вариант выше не подходит так как он не работает с кириллицей
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,934
11,701

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,934
11,701
можно в регулярке сделать проверку на начало строки или её конец, ну или " gg ", тока чёта я не нашёл эти символы, обычно "^" - это начало строки, "$" - её конец
так не подойдет, строка может выглядеть например так:
Lua:
'hey, gg'
-- или
'gg, niggers'
-- или вообще
'Player[228]: gg niggers'
 

Liquit

Известный
283
108
так не подойдет, строка может выглядеть например так:
Lua:
'hey, gg'
-- или
'gg, niggers'
-- или вообще
'Player[228]: gg niggers'
первые два случая пройдут, для третьего надо проверятьь, что символы перед и после - не буквы, а какие-нибудь цихверки или знаки препинания
 

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,934
11,701
Я перечитываю тему минут 10, но до сих пор не могу понять, почему ты не можешь использовать просто string.gsub?
потому что тогда в слове niggers gg так же заменятся на hello world
 

Rice.

Известный
Модератор
1,756
1,622
потому что тогда в слове niggers gg так же заменятся на hello world
Допускается любой знак после или перед "gg", либо всегда должно стоять " "? Глупый вопрос, но у меня есть один вариант.
 

moreveal

Известный
Проверенный
928
621
Lua:
-- да, костыль, но он же работает :)

function replaceWord(string, word, replace)
    return (" "..string.." "):gsub("%s"..word, " "..replace):match("^%s(.+)%s$")
end
---
local array = {
    "как ты",
    "howты"
}
for _,v in ipairs(array) do
    sampAddChatMessage(replaceWord(v, "ты", "я"), -1)
    --[[
        как я
        howты
    ]]
end
 
  • Нравится
Реакции: chapo

RedHolms

Известный
Проверенный
620
367
Как сделать так, что бы заменялось только отдельное слово?
Например у меня есть 2 строки:
Lua:
local one = 'niggers'
local two = 'gg - good game'
как с помощью string.gsub заменить "gg" например на "hello world", но сделать это так, что бы заменилось только "gg" во второй строке? (что бы заменялись только отдельные слова)
вариант %f[%a]gg%f[%A] не подходит

вариант выше не подходит так как он не работает с кириллицей
Lua:
function string.replaceWord(self, substr, replaceTo)
    return self:gsub('([^A-Za-z])' .. substr .. '([^A-Za-z])', '%1' .. replaceTo .. '%2')
end

Lua:
-- да, костыль, но он же работает :)

function replaceWord(string, word, replace)
    return (" "..string.." "):gsub("%s"..word, " "..replace):match("^%s(.+)%s$")
end
---
local array = {
    "как ты",
    "howты"
}
for _,v in ipairs(array) do
    sampAddChatMessage(replaceWord(v, "ты", "я"), -1)
    --[[
        как я
        howты
    ]]
end
Не будет работать с знаками препинания, только с пробелами)
 

Hatiko

Известный
Проверенный
1,512
628
str:gsub("(.?gg.?)", function(a) return #a:gsub('%s','') == 2 and 'Hello world ' or a end)
Тут только костыльными методами без нормальных регулярок. Здесь берем рядом стоящие символы рядом с "gg", тримерим пробелы и проверяем истинную длину, хз подойдет ли такой метод.
 

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,934
11,701
Lua:
-- да, костыль, но он же работает :)

function replaceWord(string, word, replace)
    return (" "..string.." "):gsub("%s"..word, " "..replace):match("^%s(.+)%s$")
end
---
local array = {
    "как ты",
    "howты"
}
for _,v in ipairs(array) do
    sampAddChatMessage(replaceWord(v, "ты", "я"), -1)
    --[[
        как я
        howты
    ]]
end
1655752512621.png


Lua:
function string.replaceWord(self, substr, replaceTo)
    return self:gsub('([^A-Za-z])' .. substr .. '([^A-Za-z])', '%1' .. replaceTo .. '%2')
end


Не будет работать с знаками препинания, только с пробелами)
1655752669058.png
 

RedHolms

Известный
Проверенный
620
367

Hatiko

Известный
Проверенный
1,512
628
Менее колхозный вариант по выше описанному:
Lua:
function replaceWord(str, substr, replaceTo)
    return str:gsub("(%S?"..substr.."%S?)", function(a) return #a == #substr and replaceTo or a end)
end

Жаркие споры, если бы не наличие спецификатора - %b
 
  • Нравится
Реакции: moreveal

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,746
4,831
Короче ебался я с вашими луа шаблонами час и нихуя не получил, сами юзайте это костыльное говно(зато быстра ыыыы), а я пойду на плюсах писать дальше