string.match()
Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 38 из 54.
В то время как string.find() сообщает вам, где в строке появляется шаблон, иногда вам нужно извлечь сам текст, который совпал. Здесь на помощь приходит string.match(), и она становится еще мощнее в сочетании с захватами (captures).
Захваты позволяют помечать определенные части шаблона, которые вы хотите извлечь. Вы создаете захват, заключая часть шаблона в круглые скобки (). Когда string.match() находит совпадение, она возвращает захваченный текст вместо просто позиции.
Вот простой пример извлечения числа из строки:
local text = "Player score: 100"
local number = string.match(text, "%d+")
print(number) -- Вывод: 100Шаблон %d+ означает «одну или более цифр». + — это модификатор, который соответствует одному или нескольким вхождениям предшествующего класса символов, позволяя захватывать многозначные числа.
Вы можете использовать захваты для извлечения определенных частей более сложного шаблона:
local message = "User: Alice sent a message"
local username = string.match(message, "User: (%a+)")
print(username) -- Вывод: AliceЗдесь скобки вокруг %a+ говорят Lua захватить последовательность букв, которая идет после "User: ". Остальная часть шаблона помогает найти нужную позицию, но возвращается только захваченная часть.
Если ваш шаблон содержит несколько захватов, string.match() возвращает их все как отдельные значения, которые вы можете присвоить нескольким переменным одновременно.
Задание
ЛегкоНапишите функцию extractPrice, которая принимает text и возвращает значение цены, найденное в строке.
Используйте string.match() с шаблоном захвата, чтобы извлечь числовую цену, которая следует за знаком доллара. Шаблон должен захватывать одну или несколько цифр, используя %d+.
Параметры:
text(string): Строка, содержащая цену в формате "Price: $XX"
Возвращает: Числовую цену в виде строки (string)
Шпаргалка
Используйте string.match() для извлечения текста, соответствующего шаблону:
local text = "Player score: 100"
local number = string.match(text, "%d+")
print(number) -- Вывод: 100Модификатор + соответствует одному или нескольким символам предшествующего класса:
%d+ -- одна или более цифр
%a+ -- одна или более буквИспользуйте круглые скобки () для создания захватов, которые извлекают определенные части шаблона:
local message = "User: Alice sent a message"
local username = string.match(message, "User: (%a+)")
print(username) -- Вывод: AliceНесколько захватов возвращают отдельные значения:
local var1, var2 = string.match(text, "(pattern1)(pattern2)")Попробуйте сами
function extractPrice(text)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа4Введение в метатаблицы
Что такое метатаблица?setmetatable и getmetatableМетаметод __indexМетаметод __newindexМетаметод __tostringАрифметические метаметоды. Часть 1Арифметические метаметоды. Часть 2Итоги — Таблица только для чтения7Продвинутая работа со строками
string.gsub() для подстановкиВведение в строковые шаблоныstring.find()string.match()Итерация с помощью string.gmatch()Итоги — Парсер лог-файлов2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов