Добавлен , опубликован

Lua-программирование для чайников

Содержание:
Строка — это текст, записанный в кавычках либо в апострофах.
Пример:
"Hello!"
'Hello!'
Если внутри кавычек нужно написать ещё кавычки, можно использовать апострофы:
"'Hello!' he said"
И наоборот:
'"Hello!" he said'
Если уж так вышло, что внутрь кавычек, которые внутри других кавычек, нужно добавить ещё кавычки, это можно сделать так:
"''Hello!' she said to me' he said"
Тут не сложно самому разобраться.
Строки можно, например, применять, как понятно, в print():
print("Hello!"); -- Hello!
print('Hello!'); -- Hello!
И ещё много где.

12.1. Конкатенация строк.

Конкатенация (по-кухонному — склейка) строк нужна для присоединения к тексту скриптового значения. Делается с помощью оператора «..» (две точки). Склейка всегда выносится за кавычки.
Пример:
a = 9;  
print("Самое большое однозначное число -- "..a);
Напечатается: «Самое большое однозначное число — 9».
Склеек может быть сколько угодно много:
a = 1;
b = 9;
c = 0;

print("Самое маленькое однозначное число -- "..a..", а самое большое -- "..b..". А ещё есть "..c.." -- это вообще ничего.")
Напечатается: «Самое маленькое однозначное число — 1, а самое большое — 9. А ещё есть 0 — это вообще ничего».
Не стоит также забывать про постановку пробелов при склейке.
Если склеивать два числа, необходимо разделить их пробелами, иначе Lua воспримет первую точку как десятичную дробь.
Правильно:
print(10 .. 10);
Не правильно:
print(10..10);
Ах да, склеивание двух чисел даст в результате число:
print(10 .. 10);
Или:
print("10".."10");
Напечатается: «1010» (тысяча десять).
Конкатенация строк можно делать не только «..», строки можно отделять запятой:
local a = 1
print('num:',a) --печатает "num:	1", однако как мы видим между строками добавляется небольшой отступ. в некоторых моментах это режет глаза, тк отступ слишком большой, кажется.

§ tostring

tostring - конвертирует параметр любого типа в строку
не все данные можно вывести на экран через print. Многие просто не на печатаются на экране, или хуже прерывается поток. Можно узнать, что за тип у вас указан, луа выводит на экран тип. В вакркрафте 3 выводит и игровые типы (определяются в луа как тип userdata): unit, effect итд.
do
    local InitGlobalsOrigin = InitGlobals
    function InitGlobals()
        InitGlobalsOrigin()
        
		--создаем героя в варкрафте
        HERO = CreateUnit(Player(0), FourCC('Obla'), 0, 0, 0)
        
		--здесь пытаюсь вывести текст
		print('HERO 1: '..tostring(HERO))
        print('HERO 2: '..HERO) --здесь код, вернее поток обрывается
        --ниже код уже не сработает никогда
        TimerStart(CreateTimer(),1.00,false,function()
            print('HERO 3: '..tostring(HERO))
            print('HERO 4: '..HERO)
        end)
        
    end
end
Это выводит игра:
это особенно полезно при конкатенации строк. Обычно, в языках программирования, где существует строгая типизация, типа в игре варкрафт вроде jass приходилось переводить плавающие числа real, целые integer в строку. Но в языке lua с этим попроще, с базовыми типами, можно сразу прописывать число:
local a = 5
print('игрок имеет '..a..' яблок')
дело в том, что куча строк может не соединиться с указанной строкой, если там указано не число. Например, boolean, или table и др. Я как-то бывало сталкивался, когда обрывался поток в игре. Бывает работает, а через какое-то время изменишь что-то и перестает работать. И никогда не подумаешь, что это строчка сломалась.
--можно напечатать boolean
local flag = true
print(flag) --печатает true

--также можно напечатать любой тип
local table = {}
print(table) --печатает table: 0xbce8f0
здесь может и заработает:
local flag = true
print('button enable: '..flag) --показывает, что кнопка включена. Эта строчка вам может не напечататься в игре
а здесь уже точно не может сработать, тк строка '|r' отсекается:
local flag = true
print('|cffff0000button enable: '..flag..'|r') 
Дабы избежать такое, лучше конвертировать flag в строку
local flag = true
print('button enabled' ..tostring(flag) )
или
local flag = true
print('|cffff0000button enable: '..tostring(flag)..'|r')
С другими типами nil, table, userdata и пр. и даже с числами при конкатенации (склейке строк по примерам выше) может потребоваться помощь tostring. Некоторые переменные могут быть пустыми nil например, и в них не записаны числа, в логике стоит это учесть.

12.2. Функции для работы со строками.

Все они начинаются со «string.» (от англ. «string» — ‘строка’), далее следует название вызываемой функции.
string.len
string.len():
Возвращает длину строки.
Короче, показывает кол-во символов в строке.
Пример, s = “Hello!”. Строка s имеет 6 символов
Возвращает длину строки, переданной в качестве параметра. Пустая строка "" имеет длину 0. Вложенные символы с кодом 0 также считаются как символ, т.е. "a\000bc\000" имеет длину 5.
Ниже вы можете прописать код разными вариантами (можете одним способом, а можно и другими):
string.len(S); -- Возвращает длину строки S
S:len(); -- Эквивалентно
#S;      -- Эквивалентно
string.rep
string.rep():
Возвращает строку, содержащую указанное число копий исходной строки.
Пример:
print("повторите 3 раза abc: "..string.rep("abc",3))
на выходе получаем
"Повторите 3 раза abc: abcabcabc"
Ниже вы можете прописать код разными вариантами (можете одним способом, а можно и другим):
string.rep(S,n); -- Возвращает строку, которая содержит n копий строки S
S:rep(n); -- Эквивалентно
string.lower
string.lower():
Заменяет все прописные буквы в строке на строчные.
Пример:
ABC -> abc - тут большие прописные буквы меняет на строчные
AbCdEf ->abcdef - неважно, есть тут строчные или нет. Он берет и все буквы строго заменяет на строчные
string.lower(S); -- Возвращает копию строки S, где все буквы в верхнем регистре заменены на буквы в нижнем регистре
S:lower(); -- Эквивалентно
string.upper
string.upper():
Заменяет в строке все строчные буквы на прописные.
Пример:
abc -> ABC - маленькие строчные буквы заменяет на большие прописные буквы
AbCdEf ->ABCDEF - неважно имеет ли строка прописные или строчные, функция все равно заменяет на прописные
string.upper(S); -- Возвращает копию строки S, где все буквы в нижнем регистре заменены на буквы в верхнем регистре
S:upper(); -- Эквивалентно
string.reverse
string.reverse():
Возвращает строку, в которой символы исходной строки расположены в обратном порядке.
Пример:
"Xgm" -> "mgX" - переставляет символы в обратном порядке, начиная с конца
0123456789 -> 9876543210 - можно так и числа переставить
string.reverse(S); -- Возвращает строку, в которой символы строки S расположены в обратном порядке
S:reverse(); -- Эквивалентно
Узоры и специальные символы
Узоры и специальные символы
Для начала нужно понять основы шаблонов, и то как обрабатывать специальные символы в Lua. Специальные символы - это такие вещи, как новые строки и вкладки. Для начала давайте рассмотрим их, они самые простые
символыописание
\n Новая строка
\r Возврат
\tab Tab
\\ \
\”
\’
\[ [
\] ]
пример есть ниже
string.format
string.format():
Генерирует строку по форматной строке и аргументам по правилам, принятым в языке C.
сначала было не понятно и мне, пока не стал читать из разных источников
Источник 1 по string.format
Возвращает параметры, передаваемые в функцию, отформатированные в соответствии первым параметром (который должен быть строкой). Строка формата должна строиться по тем же правилам, что и строка формата для семейства C функций printf. Отличие только в том, что опции/модификаторы *, l, L, n, p и h не поддерживаются, а также не поддерживается опция q. Опция q позволяет вернуть строку в формате, безопасно воспринимаемом Lua интерпретатором: строка выводится в двойных кавычках, а все двойные кавычки, перевод строки, символы с кодом 0 и обратный слеш внутри строки перекодируются (escaped). Например, вызов
string.format('%q', 'a string with "quotes" and \n new line')
будет возвращать строку:
"a string with \"quotes\" and \
new line"

Опции c, d, E, e, f, g, G, i, o, u, X и x должны использоваться только для числовых параметров, а q и s - строковых.
Эта функция не принимает строковые параметры, содержащие символы с кодом 0, кроме параметров для формата, имеющего опцию q.
Источник 2 по string.format <= очень хороший источник, только из него понял по примерам как работает функция
Синтаксис
Привязка к окну: нет.
Работа со свернутым окном: да.
Параметры заключаются в скобки и разделяются запятыми.
string.format (<s>, <arg1> [, arg2, ...])
Где:
s - строка для форматирования.
arg1, arg2 - аргументы для форматирования.
Или:
string.format ("%q", <s>)
Опция q позволяет вернуть строку в формате, безопасно воспринимаемом Lua интерпретатором: строка выводится в двойных кавычках, а все двойные кавычки, перевод строки, символы с кодом 0 и обратный слеш внутри строки перекодируются в escape-последовательность.
Спецификаторы форматирования:
%a    -- Шестнадцатеричное в виде 0xh.hhhhp+d (только С99)
%A    -- Шестнадцатеричное в виде 0Xh.hhhhP+d (только С99)
%c    -- Символ по коду
%d    -- Десятичное целое со знаком
%i    -- Десятичное целое со знаком
%e    -- Экспоненциальное представление ('е' на нижнем регистре)
%E    -- Экспоненциальное представление ('Е' на верхнем регистре)
%f    -- Десятичное с плавающей точкой
%g    -- В зависимости от того, какой вывод будет короче, используется %е или %f
%G    -- В зависимости от того, какой вывод будет короче, используется %Е или %F
%o    -- Восьмеричное без знака
%s    -- Строка символов
%u    -- Десятичное целое без знака
%x    -- Шестнадцатеричное без знака (буквы на нижнем регистре)
%X    -- Шестнадцатеричное без знака (буквы на верхнем регистре)
%p    -- Выводит указатель
%n    -- Аргумент, соответствующий этому спецификатору, должен быть указателем на целочисленную переменную. Спецификатор позволяет сохранить в этой переменной количество записанных символов (записанных до того места, в котором находится код %n)
%%    -- Выводит знак %
Примеры (очень много ниже разных примеров):

Формат s - соединения строк

Пример 1:
применение: вы можете цепочку строку менять динамично. Как если xgm.ru или xgm.guru, заменяется вторая часть. Чем то напоминает конкатенацию s = a..b, где строки склеиваются. Однако, потом при конкатенации s не вернуть.
--lua
print(string.format("yandex%s", ".ru"))    -- подставить .ru вместо %s
print(string.format("yandex%s", ".com"))   -- подставить .com вместо %s

--выше печает как:
--yandex.ru
--yandex.com
Пример 2 (эквивалентно из первого примера выше):
--lua
local str1 = "yandex"
print(string.format(str1 .. "%s", ".ru"))

--печатает на выходе:
--yandex.ru
Пример 3 (эквивалент из первого примера.):
--lua
print(string.format("%s%s", "yandex", ".ru"))  -- подставить yandex вместо первого %s и .ru вместо второго %s
print(string.format("%s%s%s", "xgm", " самый ","лучший"))  -- подставить "xgm" вместо первого %s и " самый " вместо второго %s, и "лучший" заместо третьего   %s

--печатает на выходе:
--yandex.ru
--xgm самый лучший
Пример 4:
--lua
print(string.format("mail%syandex.ru", "@")) 

--печатает: mail@yandex.ru
Пример 5:
Пример работы с таблицей arr. Циклом перебираем каждый массив и выводим на экран. Ничего особенного
--lua
local arr = {"Vasya", "Misha", "Kolya"}
for i = 1, #arr do
    print(string.format("%s@yandex.ru", arr[i]))   -- подставить вместо %s имя из массива
end

--печатает визитки:
--Vasya@yandex.ru
--Misha@yandex.ru
--Kolya@yandex.ru

Формат d: десятичные числа

Добавляет спереди нули. Пример: очень полезно в hex-строках. Например, всяких color-строках, где важна инфа о цвете. Есть системы конвертации из различных систем счислении. Один пример, приводит к ошибке 65280 => 'FF00', а должен '00FF00'. В зависимости от кол-ва параметров (argb или rgb), столько и символов. Ладно, не буду забивать голову, это один из примеров применения. Ссылка
Второе применение это даты, пример 1.6.2006 => 01.06.2006
Пример 6:
--lua
local a = 126
local b = string.format("%05d", a)  -- если число состоит меньше чем из 5 цифр, то оно будет дополнено нулями до пяти цифр
print(b)  --печатает: 00126

local c = 7
local e = string.format("%04d", c)  -- если число состоит меньше чем из 4 цифр, то оно будет дополнено нулями до четырех цифр
print(e)  --печатает: 0007
Пример 7:
--lua
local d, m, y = 6, 10, 2017
print(string.format("%02d/%02d/%04d", d, m, y))  -- подставить дату, если день или месяц состоят из 1 цифры, то будет добавлен 0. Т. е. вместо 6 будет 06

--печает: 06 10 2017

Форматы x или X: 16-ричный формат

Короче обычная конвертация сс из числа в hex-строку. Тут отобразить либо большими буквами %X (типа 10 -> A, 11 -> B итд) или прописными %x (10 -> a, 11 -> b итд)
Пример 8:
--lua
-- Перевести десятичный цвет в шестнадцатеричный
print(string.format("%x", 16690957))
print(string.format("%X", 16690957))

--Печатает:
--feaf0d
--FEAF0D

Формат f: округление плавающих чисел после запятой float

Пример 8:
--lua
-- округлить число до нужной точности
local a = 12.47652853
print(string.format("%.3f", a))  -- до 3 знаков после точки
print(string.format("%.5f", a))  -- до 5 знаков после точки

Формат q

Опция q позволяет вернуть строку в формате, безопасно воспринимаемом Lua интерпретатором: строка выводится в двойных кавычках, а все двойные кавычки, перевод строки, символы с кодом 0 и обратный слеш внутри строки перекодируются в escape-последовательность
В варкрафте эта функция при обработке содержания строки, пример составление пути файла, пример сейв-лоад, прелоад
Пример 10:
--lua
local a = [[C:\Users\abc\Desktop\file123.txt]]
a = string.format("%q", a)  -- вернёт строку в двойных кавычках, \ будут заменены на \\
print(a)
string.byte
string.byte():
Возвращает числовые коды символов UTF-8 строки.
Помните, что каждый символ хранится в байтах. Цифры и английские буквы весят меньше, каждый из этих символов будет весить 1 байт. Русские буквы весят 2 байта.
каждый символ в таблице UTF-8 имеет свой номер. преобразует символ в число.
S = "Текст";
string.byte(S, i); -- Возвращает числовой код символа в строке по индексу i
   -- i (необязательный параметр) - начальный индекс (по умолчанию, 1)
S:byte(i); -- Эквивалентно
примеры:
string.byte(S, 1); -- Вернет 210
string.byte(S, 2); -- Вернет 229
string.byte(S, 3); -- Вернет 234
string.byte(S, 4); -- Вернет 241
string.byte(S, 5); -- Вернет 242
string.char
string.char():
Преобразует набор числовых кодов символов в строку.
string.char(n,...);               -- Возвращает символы по числовым кодам, может принимать любое количество кодов через запятую
string.char(210);                 -- Вернет "Т"
string.char(210,229,234,241,242); -- Вернет "Текст"
string.find
string.find():
Выполняет поиск в строке первого вхождения подстроки, соответствующей заданному шаблону. Возвращает индексы начального и конечного символов найденной подстроки (или ноль). Если поиск успешен, то find возвращает индексы s где найдено совпадение с шаблоном, т.е. где начинается и кончается; иначе возвращает nil.
Короче, возвращает позицию подстроки в строке. Так понял, что каждый символ в строке имеет номер. Пример: “Привет мир!” - в этой строке “мир” с 8-10 номера-индексы. Если в строке существует несколько одинаковых подстрок, то все равно команда string.fing возвращает индексы первой подстроки. Пример: “Я за мир, и ты за мир!” - вернет 6,8
string.find (s, pattern)
--s - строка, в которой начинается поиск
--pattern - подстрока, которую необходимо найти в строке s

--Для поиска можно использовать регулярные выражения. 
string.find (s, pattern [, init [, plain]])
или
<s>:find(<шаблон> [, стартовая_позиция_поиска [, true]])


--init - числовой параметр указывает откуда начинать поиск (необязательный параметр). По умолчанию равен 1, также может быть отрицательным. короче это стартовая позиция поиска
--plain - если указано производится поиск подстроки как есть. Необязательный параметр. plain выключает возможность поиска по шаблону, в этом случае производится поиск подстроки как есть, т.е. считается, что она не содержит «шаблонных» ("magic") символов. Помните, что если указан параметр plain, то параметр init должен быть указан тоже. 
Если шаблон содержит захваты (captures) и поиск успешен, то захваченные значения также возвращаются, сразу после двух индексов.
Примеры с string.find
Пример:
Находит номер стартовой позиции подстроки.
--lua
local a = "New York"  --строка
local start_pos = string.find(a, "Yo")      -- искать начальную позицию Yo
print(start_pos)
Пример:
Здесь кроме стартовой позиции подстроки выводит еще и конечную
--lua
local a = "New York"                                 -- строка
local start_pos, end_pos = string.find(a, "York")    -- искать начальную и конечную позицию York
print(start_pos, end_pos)
Пример (эквивалент из примера выше):
--lua
local a = "New York"                         -- строка
local start_pos, end_pos = a:find("York")    -- альтернативная запись функции 
print(start_pos, end_pos)
Пример:
Нужно в строке a подобрать нужную подстроку. Если в строке a несколько совпадающих строк, то можно выбирать позицию подстроки, пример мне нужны позиции второй подстроки
start_pos,end_pos = string.find(STRING,substring,2)
--lua
local a = "3 кг яблок и 3 кг груш"           -- строка
local start_pos = a:find("3")                -- найти число 3 в строке
print (start_pos)
start_pos = a:find("3", 2)             -- найти число 3 в строке, начиная со 2й позиции
print(start_pos)
Использование регулярных выражений в string.find
.    -- Любой символ
%a    -- Буква (только англ.!)
%A    -- Любая буква (русская), символ, или цифра, кроме английской буквы 
%c    -- Управляющий символ
%d    -- Цифра
%D    -- Любая буква, или символ, кроме цифры
%l    -- Буква в нижней раскладке (только англ.!)
%L    -- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке
%p    -- Символ пунктуации
%P    -- Любая буква, символ, или цифра, кроме символа пунктуации
%s    -- Символ пробел
%S    -- Любая буква, символ, или цифра, кроме символа пробела
%u    -- Буква в верхней раскладке (только англ.!)
%U    -- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке
%w    -- Любая буква, или цифра (только англ.!)
%W    -- Любой символ, или буква (русская), кроме английской буквы, или цифры
%x    -- Шестнадцатеричное число
%X    -- Любая буква, или символ,  кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа 
%z    -- Строковые параметры, содержащие символы с кодом 0
заметка: В варкрафте приходится в специальной строке писать код с двойными %%. Не забывайте об этом.
Пример:
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local start_pos, end_pos = str1:find("%d")      -- найти позицию первой цифры в строке
print(start_pos, end_pos)
--  печатает 27 27 (позицию первого числа в строке)

--пример 2
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local start_pos, end_pos = str1:find("%d+")      -- найти позиции первого набора цифр в строке. Тут точнее десятичные числа, не цифры
print(start_pos, end_pos)

--печатает: 27 29  (это подстрока "360")
Пример:
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local start_pos, end_pos, num1 = string.find(str1, "(%d+)")           -- найти позицию первого числа в строке и присвоить переменной num1
print(start_pos, end_pos, num1)
Пример:
Тут необычный способ, получаем не позиции, а подстроку. Можно так проверить что же в подстроке лежит
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local _, _, num1 = string.find(str1, "(%d+)")    -- если позиции не нужны, то можно использовать _(нижнее подчёркивание)
print(num1) --Печатает: 360
Пример:
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local s, e, num1, num2 = string.find(str1, "(%d+), Y = (%d+)")    -- найти координаты X и Y, присвоить переменным num1 и num2
print(num1, num2) -- печатает: 360 638
-- или так
str1 = "Координаты: X = 123, Y = 547"      -- строка
s, e, num3, num4 = string.find(str1, "(%d+)[^%d]+(%d+)")    -- [^%d]* - означает любые символы, кроме числа
print(num3, num4) --печатает: 123 547
Пример:
--lua
local str1 = "С 12:30 до 13:15 обед"      -- строка
local s, e, num1, num2, num3, num4 = str1:find("(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)")    -- найти 4 числа, между числами могут присутствовать любые символы
print(num1, num2) -- печатает: 12 30
print(num3, num4) -- печатает: 13 15
string.match
string.match():
Выполняет поиск в строке первого вхождения подстроки, соответствующей заданному шаблону. Возвращает найденную подстроку.. Для поиска можно использовать регулярные выражения.
string.match (<s>, <шаблон> [, стартовая_позиция_поиска])
или:
<s>:match(<шаблон> [, стартовая_позиция_поиска])
Где:
s - строка.
шаблон - что искать или регулярное выражение.
стартовая_позиция_поиска - стартовая позиция поиска, по умолчанию 1. Необязательный параметр.
Поддерживаемые опции регулярных выражений:
.    -- Любой символ
%a    -- Буква (только англ.!)
%A    -- Любая буква (русская), символ, или цифра, кроме английской буквы 
%c    -- Управляющий символ
%d    -- Цифра
%D    -- Любая буква, или символ, кроме цифры
%l    -- Буква в нижней раскладке (только англ.!)
%L    -- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке
%p    -- Символ пунктуации
%P    -- Любая буква, символ, или цифра, кроме символа пунктуации
%s    -- Символ пробел
%S    -- Любая буква, символ, или цифра, кроме символа пробела
%u    -- Буква в верхней раскладке (только англ.!)
%U    -- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке
%w    -- Любая буква, или цифра (только англ.!)
%W    -- Любой символ, или буква (русская), кроме английской буквы, или цифры
%x    -- Шестнадцатеричное число
%X    -- Любая буква, или символ,  кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа 
%z    -- Строковые параметры, содержащие символы с кодом 0
Пример
--lua
local str1 = "Координаты: X = 360, Y = 638"       -- строка
local num = str1:match("%d+")      -- найти первое число в строке
print(num) --вернет 360
Пример
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local num1, num2 = string.match(str1, "(%d+)[^%d]+(%d+)")    -- найти 2 числа, между числами могут присутствовать любые символы
print(num1, num2) --покажет 360 и 638
Пример
--lua
print("clear") print("mode compact")
local str1 = "С 12:30 до 13:15 обед"      -- строка
local num1, num2, num3, num4 = str1:match("(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)")    -- найти 4 числа, между числами могут быть любые символы
print(num1, num2) -- 12    30
print(num3, num4) -- 13    15
Пример
--lua
local a = "tr"
local b = 123
local tmp = tostring(a):match("%d+")   -- если переменная 'a' является числом вернёт true, иначе false
print(tmp) --возвращает nil
tmp = tostring(b):match("%d+")   -- если переменная 'b' является числом вернёт true, иначе false
print(tmp) --возвращает 123
Пример
--lua
local str1 = "Недавно Вася съел 15 яблок, обжора..."
local a = str1:match("[съел]+%s+(%d+)%s+[яблок]+")    -- найти число между 'съел' и 'яблок'
print(a)     -- показать в сообщении, в правом нижнем углу экрана. вернет 15
string.gmatch
string.gmatch():
Возвращает итератор, который на каждой итерации возвращает подстроку, соответствующую заданному шаблону.
string.gmatch - возвращает итератор, который, при каждом вызове, возвращает следующее вхождение шаблона в строке. Если шаблон не содержит захватов, то простое сравнение будет выполнено при каждом вызове. Для поиска можно использовать регулярные выражения.
string.gmatch (<s>, <шаблон>)
Или:
<s>:gmatch(<шаблон>)
Где:
s - строка.
шаблон - что искать или регулярное выражение.
Или:
for <var> in string.gmatch(<s>, <шаблон>) do
-- код
end
Где:
var - переменная, которой на каждой итерации будет присвоен результат поиска.
Поддерживаемые опции регулярных выражений:
.    -- Любой символ
%a    -- Буква (только англ.!)
%A    -- Любая буква (русская), символ, или цифра, кроме английской буквы 
%c    -- Управляющий символ
%d    -- Цифра
%D    -- Любая буква, или символ, кроме цифры
%l    -- Буква в нижней раскладке (только англ.!)
%L    -- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке
%p    -- Символ пунктуации
%P    -- Любая буква, символ, или цифра, кроме символа пунктуации
%s    -- Символ пробел
%S    -- Любая буква, символ, или цифра, кроме символа пробела
%u    -- Буква в верхней раскладке (только англ.!)
%U    -- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке
%w    -- Любая буква, или цифра (только англ.!)
%W    -- Любой символ, или буква (русская), кроме английской буквы, или цифры
%x    -- Шестнадцатеричное число
%X    -- Любая буква, или символ,  кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа 
%z    -- Строковые параметры, содержащие символы с кодом 0
Примеры
local str1 = "hello world from Lua"          -- строка
for w in string.gmatch(str1, "%a+") do   -- цикл, ищет все слова в строке
    print(w)                            -- вывести в лог содержимое переменной 'w'
end
Вот что вывел мне выше
hello
world
from
Lua

local str1 = "Координаты: X = 360, Y = 638"    -- строка
for w in string.gmatch(str1, "%d+") do   -- искать все числа в строке
    print(w)                              -- вывести в лог
end
Выводит выше код:
360
638

Пример:
--lua
local str1 = "Координаты: X = 360, Y = 638, цвет = 255"    -- строка
local arr = {}    -- массив, в который будет записан результат поиска
for w in string.gmatch(str1, "%d+") do   -- искать все числа в строке
    table.insert(arr, w)                -- добавить значение переменной w в массив
end
print(table.concat(arr, ", "))            -- вывести в лог содержимое массива через запятую, arr[1] - первый элемент, arr[2] - второй и т. д.
Выше содержимый код выводит строку: 360, 638, 255

--lua
local str1 = "С 12:30 до 13:15 обед"      -- строка
local arr = {}    -- массив, в который будет записан результат поиска
for w in string.gmatch(str1, "%d+%:%d+") do   -- искать в строке время в формате число:число
    table.insert(arr, w)                -- добавить значение переменной w в массив
end
print(table.concat(arr, ", "))            -- вывести в лог содержимое массива через запятую
Выше содержимый код выводит строку: 12:30, 13:15
string.sub
string.sub():
Возвращает подстроку исходной строки. возвращает подстроку строки, которая начинается с символа с индексом i и продолжается до символа с индексом j; i и j могут быть отрицательными. Отрицательное значение может быть результатом обратной стороны, пример “abcd” c -1 по -4 вернет “dcba”
string.sub (<s>, <i> [, j])
Или:
<s>:sub(<i> [, j])
Где:
s - строка.
i - индекс начального символа. Если 'i' меньше 0, то возвращает указанное количество последних символов строки.
j - необязательный параметр. Индекс конечного символа, по умолчанию значение равно -1
Примеры:
--lua
print(string.sub("Hello", 3))   --вывести в лог первые 3 символа слова Hello

--lua
local str1 = "qwerty"               
local str2 = string.sub(str1, -3)  -- присвоить результат функции sub другой переменной      
print(str2)

--lua
local str1 = "qwerty"               
local str2 = str1:sub(2, 4)       -- использована альтернативная запись функции         
print(str2) 
string.gsub
string.gsub():
Возвращает копию исходной строки, в которой все вхождения шаблона заменены на строку, заданную третьим аргументом. Этот аргумент может быть строкой, таблицей или функцией.
string.gsub - возвращает копию строки, в которой все вхождения 'шаблона поиска' заменяются на 'шаблон замены', который может быть строкой, таблицей или функцией. Также возвращает как второе значение – общее количество проведенных подстановок.
Если 'шаблон замены' строка, то используется ее значение для замены. Символ % работает как символ со специальным назначением: любая последовательность в 'шаблоне замены' в виде %n, где n от 1 до 9, заменяется на n-ную захваченную подстроку. Последовательность %0 заменяется на найденную подстроку.
Если 'шаблон замены' является таблицей, то она запрашивается для каждого сравнения, с использованием первого захваченного значения как ключ; если шаблон не содержит захватов, то используется результат простого сравнения как ключ.
Если 'шаблон замены' является функцией, то эта функция вызывается каждый раз, когда обнаруживается совпадение. В качестве параметров ей передаются все захваченные подстроки; если шаблон не содержит захватов, то передается результат сравнения как один параметр.
string.gsub (s, pattern, repl [, n])
--или
string.gsub (<s>, <шаблон поиска>, <шаблон замены>, [n])
--или
<s>:gsub(<шаблон поиска>, <шаблон замены>, [n])
где
s-строка
pattern - шаблон поиска
replace - шаблон замены
n - сколько максимум можно сделать замену
Поддерживаемые опции регулярных выражений:
.    -- Любой символ
%a    -- Буква (только англ.!)
%A    -- Любая буква (русская), символ, или цифра, кроме английской буквы 
%c    -- Управляющий символ
%d    -- Цифра
%D    -- Любая буква, или символ, кроме цифры
%l    -- Буква в нижней раскладке (только англ.!)
%L    -- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке
%p    -- Символ пунктуации
%P    -- Любая буква, символ, или цифра, кроме символа пунктуации
%s    -- Символ пробел
%S    -- Любая буква, символ, или цифра, кроме символа пробела
%u    -- Буква в верхней раскладке (только англ.!)
%U    -- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке
%w    -- Любая буква, или цифра (только англ.!)
%W    -- Любой символ, или буква (русская), кроме английской буквы, или цифры
%x    -- Шестнадцатеричное число
%X    -- Любая буква, или символ,  кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа 
%z    -- Строковые параметры, содержащие символы с кодом 0
Примеры:
--lua
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "hello world"          -- строка
print(str1)
local str2 = string.gsub(str1, "world", "user")    -- заменить 'world' на 'user'
print(str2)

--lua
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "one, two, three, four, five"   -- строка
print(str1)
local str2 = string.gsub(str1, ",", " -")    -- заменить ',' на ' -'
print(str2)

 --lua
-- найти запятые, после которых нет пробела, и добавить пробел
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "one, two,three, four,five"     -- строка
print(str1)
local str2 = string.gsub(str1, ",", ", ")    -- заменить ',' на ', '
print(str2)

--lua
print("clear") print("mode compact")      -- очистить лог, компактный режим
local str1 = "Координаты: X = 360, Y = 638"    -- строка
print(str1)
local str2 = str1:gsub("(%d+)([^%d]+)(%d+)", "%3%2%1")  -- поменять координаты: X на Y и Y на X
print(str2)

--lua
print("clear") print("mode compact")    -- очистить лог, компактный режим
local t = {green = "red", black = "blue"}
local str1 = "green, black, black, green"      -- строка
print(str1)
local str2 = string.gsub(str1, "(%a+)", t)    -- заменить все слова 'green' на 'red' и 'black' на 'blue'
print(str2)

--lua
-- найти все числа в строке и умножить их на 2
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "green, 7, black, 12, green"      -- строка
print(str1)
local str2 = string.gsub(str1, "(%d+)", function(s) return s * 2 end)  -- функция вызывается каждый раз, когда обнаруживается совпадение
print(str2)

local str2, count = string.gsub(str1, "(%d+)", function(s) return s * 2 end)  -- в переменную count будет записано количество подстановок
print(str2)
print(count)

--lua
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "qwe1213rty"        -- строка
print(str1)
local str2 = string.gsub(str1, "%d", "")    -- удалить из строки все цифры
print(str2)

--lua
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "qwe1213rty"        -- строка
print(str1)
local str2 = string.gsub(str1, "%D", "")    -- удалить из строки все кроме цифр
print(str2)

--lua
print("clear") print("mode compact")    -- очистить лог, компактный режим
local str1 = "1 2 3 4 5 6 7 8 9"   -- строка
print(str1)
local str2 = string.format("%s" .. string.gsub(str1, " ", ", ") .. "%s", "(", ")")   -- добавить запятые между числами и заключить всю строку в скобки
print(str2)
string.dump
string.dump():
Возвращает строку, содержащую двоичное представление функции Lua с заданным именем.

`
ОЖИДАНИЕ РЕКЛАМЫ...