string.find()
Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 37 из 54.
Теперь, когда вы понимаете символьные классы, вы можете использовать их с string.find() для поиска шаблонов вместо точного текста. Это открывает широкие возможности для валидации и анализа текста.
Функция string.find() работает с шаблонами так же, как и с обычными строками — она возвращает позицию, в которой шаблон встречается впервые:
local text = "User123"
local position = string.find(text, "%d")
print(position) -- Результат: 5Это находит первую цифру в строке, которая находится на позиции 5. Вы также можете искать противоположное, используя классы символов в верхнем регистре:
local code = "ABC123"
local position = string.find(code, "%D")
print(position) -- Вывод: 1Здесь %D соответствует любому нецифровому символу, поэтому он находит первую букву в позиции 1.
Распространенная задача валидации — проверка того, начинается ли строка с определенного шаблона. Вы можете использовать якорь ^ в начале шаблона, чтобы поиск соответствия выполнялся только в начале строки:
local username = "player42"
local startsWithLetter = string.find(username, "^%a")
if startsWithLetter then
print("Valid username")
else
print("Username must start with a letter")
endЭтот шаблон проверяет, начинается ли строка с буквы, что делает его полезным для валидации ввода в тех случаях, когда требуются определенные форматы.
Задание
ЛегкоНапишите функцию startsWithLetter, которая принимает text и возвращает значение, указывающее, начинается ли строка с буквы.
Используйте string.find() с якорем ^ и символьным классом %a, чтобы проверить, начинается ли строка с буквы.
Параметры:
text(string): Строка для проверки
Возвращает: true, если строка начинается с буквы, иначе false (boolean)
Шпаргалка
Используйте string.find() с классами символов для поиска шаблонов в строках. Она возвращает позицию, в которой шаблон совпадает в первый раз:
local text = "User123"
local position = string.find(text, "%d")
print(position) -- Результат: 5Классы символов в верхнем регистре соответствуют противоположным значениям (несовпадающим символам):
local code = "ABC123"
local position = string.find(code, "%D")
print(position) -- Результат: 1Используйте якорь ^ в начале шаблона, чтобы поиск выполнялся только с начала строки:
local username = "player42"
local startsWithLetter = string.find(username, "^%a")
if startsWithLetter then
print("Valid username")
else
print("Username must start with a letter")
endПопробуйте сами
function startsWithLetter(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()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов