Шаблоны в lua
Поиск по шаблону в языке lua.
Регулярное выражение является формулой для сравнения строк по определенному шаблону. В языке Lua (и в документации на него) понятие "регулярное выражение" отсутствует. Однако имеется понятие "шаблон". Видимо, полный POSIX модуль разбора слишком велик для lua, а при острой на то необходимости можно подключить стандартную regexp библиотеку.
Lua имеет несколько функций строки, которые используют шаблоны (то, что иногда ошибочно называют регулярными выражениями). Среди них:
- string.find (str, pattern) - находит первый экземпляр шаблона в строке
- string.gfind (str, pattern) - когда вызывается повторно, находит каждый последующий экземпляр шаблона в строке
- string.gsub (str, pattern, replace) - возвращает строку, в которой все вхождения шаблона в строке были заменены на третий параметр
- string.match (str, pattern, from) - Возвращает список совпадений шаблона в строке, начиная поиск с указанного номера символа в строке (1 является первым символом строки, 2, второй и т.д.).
Как строить шаблоны?
Ниже приведен (надеюсь) полный список всех имеющихся классов. Класс - это набор символов:
. --- представляет все символы.
%a --- представляет все буквы.
%c --- представляет все управляющие символы.
%d --- представляет все цифры.
%l --- представляет все строчные буквы.
%p --- представляет все знаки препинания.
%s --- представляет все пробелы.
%u --- представляет все заглавными буквами.
%w --- представляет все алфавитно-цифровых символов.
%x --- представляет все шестнадцатеричные цифры.
%z --- символ с представлением 0.
Использование варианта класса с заглавными буквами меняет смысл класса на противоположный. Например %A - любые символы кроме букв, %S - печатные символы
%x (где х есть любой не алфавитно-цифровой символ) --- представляет символ х. Таким способом можно указать символы, обычно используемые для магии.
[Set] --- представляет класс, который является объединением всех символов в наборе. Диапазон символов может быть определен путем указания первого и последнего символа диапазона через дефис '-'. Все классы, описанные выше, могут быть также использованы в качестве компонентов набора. Все остальные символы в наборе представляют самих себя. Например, [%w_] или [_%w] представляет все алфавитно-цифровые символы плюс символ подчеркивания.
[^Set] --- представляет противоположное множество, где набор интерпретируется "кроме указанных".
Все шаблоны состоят из последовательности этих классов.
Модификаторы
х* - соответствует 0 или более повторений х. Всегда будет соответствовать максимально возможной цепочке.
х+ - соответствует 1 или более повторений х. Всегда будет соответствовать максимально возможной цепочке.
х- - соответствует 0 или более повторений х. Всегда будет соответствовать кратчайшие цепи.
х? - соответствует 0 или 1 вхождению х.
Есть также четыре специальных элементов шаблона
%n - n должно быть числом от 1 до 9. захватывает n-ную найденную подстроку
%bху - соответствует подстрока, начиная с х и заканчивая у. Подстрока также может иметь одинаковое число х и у.
^ - Когда в начале шаблона, представляет начало строки.
$ - Когда в конце картины, он заставляет шаблоном конце строки.
Если символы ^ и $ встретились в другом месте шаблона, они теряют свой магический смысл.
Шаблоны могут также иметь подмаски. Они заключаются в круглые скобки () и используются как счетчики повторений. Сами подмаски могут быть доступны с помощью элемента %n. Использование пустого захвата () возвращает строку позиции, где найдено совпадение.
Примеры шаблонов в Lua:
[%+%-%d]%d*%.?%d*[eE]?[%+%-]?%d* -- шаблон для Float
[%a%.\\][:%][%w%._%-\\]* -- шаблон для полного имена файла
[%a_][%w_]* -- шаблон для идентификатора (первый символ - не цифра)
[+%-%d]%d* -- шаблон для integer
Примеры использования шаблонов в Lua:
line = line:gsub('//.*$','') -- удаление из строки комментариев, начинающихся с двух косых черт
line = line:match("^%s*(.-)%s*$") -- удаление начальных и конечных пробелов
path = filename:match("^(.*)[/\\][^/\\]*$") -- получение пути к файлу из полного имени
_, _, h, m, s = string.find(t, "%s*(%d+)%p(%d+)%p(%d+)") -- разбор строковой даты или времени
key, value = line:match("%s*([^=]*)%s*%=%s*(.-)%s*$") -- разбор конструкции key=value
См. также
string.find (str, ".")
то ничего путного не выйдет, так как точка - спецсимвол
. --- представляет все символы.
удалось обойти это так:
string.find(str, '[.]')
string.find(str,"%.")
символ процента отменяет магию
Есть путь к файлу:
"C:\Test\125.50\test.lua"
нужно получить таблицу:
return {
"C:",
"Test",
"125.50", -- вот эта папка не обязательно содержит точку
"test.lua"
}
Подойдет?
RSS лента комментариев этой записи