2015-07-17 4 views
2
function msgcontains(msg, what) 
    msg = msg:lower() 

    -- Should be replaced by a more complete parser 
    if type(what) == "string" and string.find(what, "|", 1, true) ~= nil then 
     what = what:explode("|") 
    end 

    -- Check recursively if what is a table 
    if type(what) == "table" then 
     for _, v in ipairs(what) do 
      if msgcontains(msg, v) then 
       return true 
      end 
     end 
     return false 
    end 

    what = string.gsub(what, "[%%%^%$%(%)%.%[%]%*%+%-%?]", function(s) return "%" .. s end) 
    return string.match(msg, what) ~= nil 
end 

Эта функция используется на сервере RPG, в основном я пытаюсь соответствовать тому, что говорит игрокПопытка проверить, если строка содержит данное слово

например; если msgcontains (MSG, «привет»), то

тзд = сообщение игрок послал

Однако, это ничего подобного «yesimstupid привет» соответствие, это действительно не должно совпадать, потому что «привет «Нет ни слова, никаких идей, что я могу сделать? T_T

+0

Попробуйте 'return string.match ('' ..msg .. '', '% W' .. что .. '% W') ~ = nil' –

ответ

1

Вы можете использовать трюк, упомянутый Егор в своем комментарии, а именно: добавить некоторые символы без слов на строку ввода, а затем заключите регулярное выражение с не-буквой %A (или не алфавитно-цифровой с %W, если вы хотите также запретить цифры).

Таким образом, использование

return string.match(' '..msg..' ', '%A'..what..'%A') ~= nil 

или

return string.match(' '..msg..' ', '%W'..what..'%W') ~= nil 

Этот код:

--This will print "yes im stupid hi" since "yes" is a whole word 
msg = "yes im stupid hi" 
if msgcontains(msg, "yes") then 
    print(msg) 
end 
--This will not print anything 
msg = "yesim stupid hi" 
if msgcontains(msg, "yes") then 
    print(msg) 
end 

Вот такой CodingGround demo

0

Просто подумайте о том, «что такое слово». Слово имеет определенные символы спереди и сзади, как пробелы (пробел, табулятор, новая линия, возврат каретки, ...) или пунктуация (запятая, точка с запятой, точка, строка, ...). Кроме того, слово может быть в начале или конце текста.

% S, % р, ^ и $ вас должно заинтересовать.

Подробнее см. here.

3

Frontiers хороши для работы с границами шаблон (см Lua frontier pattern match (whole word search)), и вы не должны изменять строку: только

return msg:match('%f[%a]'..what..'%f[%A]') ~= nil 

Границы '%f[%a]' матчей, если предыдущий символ не был в «% а», а следующий. Граница границы доступна с 5.1 и официальная с 5.2.

+1

Действительно! '% f' доступен в 5.1.5! –

Смежные вопросы