Перейти к содержимому
  • 0
kaka888

Как вырезать слова из строки?

Вопрос

В луа можно обрезать строку?

Например мне нужно читать сообщения из чата с помощью чат-бокса, искать в сообщении плохие слова и выдавать куда-то уже сообщения без плохих слов. В библиотеке string ничего не нашёл((

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

string.gsub, безусловно. Забудь про какие-то жутчайшие костыли с string.find и прочим. Гсаб тут просто рулит и педали от пола не отрывает.

  1. Он может поменять одно слово на другое.
    string.gsub("abc", "a", "d") == "dbc"

     

  2. Он может поменять один паттерн на что-то другое.
    string.gsub("hello world", "%w+", [["%1"]]) == [["hello" "world"]]

     

  3. Он может поменять один паттерн на табличное значение.
    local greek = {
      l = "λ",
      o = "ο",
      g = "γ",
      i = "ι",
      k = "κ",
      e = "ή",
    }
    
    string.gsub([[logic derives from Ancient Greek $l$o$g$i$k$e]], "$(%w+)", greek) == "logic derives from Ancient Greek λογική"

     

  4. И самое крутое: он может менять один паттерн по функции, вызывая её для каждого матча.

    string.gsub([[breaking news: title case considered stupid]], "(%w)(%w*)", function(head, tail)
      return head:upper() .. tail
    end) == [[Breaking News: Title Case Considered Stupid]]

     

Читайте подробнее вот где-то тут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

string.find возвращает 2 величины - начало искомой подстроки и конец.

Т.е. ты можешь получить начало слова и его конец, а затем обрезать с помощью unicode.sub(строка_для_обрезки,начало,конец). string.sub лучше для строк с юникодом не использовать.

Пример кода - https://ideone.com/tEZHqh

Что делает код выше со строкой str:

 

1.Ищет в строке подстроку "badWord" и получает положение ее начала и конца с помощью string.find(строка_в_которой_ищем,строка_которую_ищем)

2. Обрезает строку до первой буквы слова с помощью string.sub(строка_для_обрезки,начало,конец)

3. Обрезает строку от последней буквы слова с помощью string.sub(строка_для_обрезки,начало) (конец можно опустить - тогда он станет равен -1, т.е. до самого конца строки)

4. Конкатекует две строки, получая строку без слова badWord

 

В данном случае надо будет делать это в цикле, пока string.find не вернет nil, и переходить к следующему "запрещенному" слову.

 

P.s. возможно много информации. Отвечаю кратко - тебе нужен string.sub (s, i [, j]), где s - строка для обрезки, i - начало, j - конец.

 

UPD: Не подумав написал. Можно использовать string.gsub(строка_из_которой_удалить,слово_которое_удалить,на_что_заменить), хотя при некоторой доработке можно с помощью алгоритма выше сделать складывание "запрещенных" слов в отдельную строку/таблицу, чего gsub не позволяет.

Изменено пользователем HeroBrine1st
UPD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Благодарю. Жаль, что я пока не знаю, что такое паттерн, "%" и "$" :((

Изменено пользователем kaka888

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 минут назад, kaka888 сказал:

Благодарю. Жаль, что я пока не знаю, что такое паттерн, "%" и "$" :((

 

Паттерны, они же шаблоны. Они же аналог "регексов" для Луа.

 

Вот тут про паттерны на английском: http://lua-users.org/wiki/PatternsTutorial

Тут - на русском: http://bot4sale.ru/blog-menu/qlua/265-lua-patterns.html

 

Ну и вообще погуглить можно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...