Как проверить, найден ли соответствующий текст в строке в Lua?

Мне нужно сделать условие, которое истинно, если конкретный соответствующий текст найден хотя бы один раз в текстовой строке, например:

str = "This is some text containing the word tiger."
if string.match(str, "tiger") then
    print ("The word tiger was found.")
else
    print ("The word tiger was not found.")

Как я могу проверить, найден ли текст где-то в строке?


person Village    schedule 15.04.2012    source источник


Ответы (1)


Есть 2 варианта поиска подходящего текста; string.match или string.find.

Оба они выполняют поиск регулярных выражений в строке, чтобы найти совпадения.


string.find()

string.find(subject string, pattern string, optional start position, optional plain flag)

Возвращает startIndex и endIndex найденной подстроки.

Флаг plain позволяет игнорировать шаблон и вместо этого интерпретировать его как литерал. Вместо того, чтобы интерпретировать (tiger) как группу захвата регулярных выражений, соответствующую tiger, вместо этого он ищет (tiger) в строке.

И наоборот, если вы хотите, чтобы регулярное выражение соответствовало, но по-прежнему нужны буквальные специальные символы (например, .()[]+- и т. д.), вы можете экранировать их с помощью процента; %(tiger%).

Скорее всего, вы будете использовать это в сочетании с string.sub

Пример

str = "This is some text containing the word tiger."
if string.find(str, "tiger") then
  print ("The word tiger was found.")
else
  print ("The word tiger was not found.")
end

string.match()

string.match(s, pattern, optional index)

Возвращает найденные группы захвата.

Пример

str = "This is some text containing the word tiger."
if string.match(str, "tiger") then
  print ("The word tiger was found.")
else
  print ("The word tiger was not found.")
end
person hjpotter92    schedule 15.04.2012
comment
или, используя синтаксис сахара str:find("tiger") - person Ciprian Tomoiagă; 11.04.2017
comment
Это работает для тривиального примера тигра, но есть много возможных строк поиска, которые будут интерпретироваться как шаблон, а не буквальная строка, и нарушить код. Пожалуйста, рассмотрите возможность обновления приведенного выше примера, чтобы он поддерживал строку поиска tiger(. - person Nathan Wiebe; 06.08.2017
comment
@NathanWiebe Вы правы. Поскольку это, по-видимому, широко популярный ответ на этот вопрос, я добавил раздел для него. Не стесняйтесь расширять его дальше :) - person hjpotter92; 07.08.2017
comment
Экранирование символов сопоставления с шаблоном по-прежнему не работает в случае произвольной строки поиска, которая действительно произвольна (не жестко закодирована) и может содержать или не содержать специальные символы, от которых у вас нет возможности экранировать. В идеале ответ должен отсылать читателей к необязательному четвертому параметру, который может отключить поиск по шаблону. например string.find(myArbitraryString, myArbitrarySearchString, 1, true), который будет работать для любого значения myArbitrarySearchString, которое может встретиться во время выполнения, включая значение tiger(. - person Nathan Wiebe; 08.08.2017
comment
@NathanWiebe string.find() имеет четвертый аргумент plain, который, если установлено значение true, заставляет второй аргумент рассматриваться как простая строка. В то время как ('aa+bb'):find('a+b') возвращает nil (нет совпадения), ('aa+bb'):find('a+b', 1, true) возвращает 2, 4 (совпадение найдено). - person Feuermurmel; 13.06.2020
comment
@NathanWiebe Спасибо, как раз то, что мне было нужно :) - person SebMa; 12.11.2020