Germany | Finland | Saint Petersburg | Drive

Шаблоны в lua

Опубликовано в QLua

Поиск по шаблону в языке 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

 


См. также 

 

Комментарии   

# Alpinist573 21.10.2015 11:27
Если захочется поискать в строке точку "." с помощью

string.find (str, ".")

то ничего путного не выйдет, так как точка - спецсимвол
. --- представляет все символы.

удалось обойти это так:

string.find(str, '[.]')
Ответить | Ответить с цитатой | Цитировать
# admin 21.10.2015 11:52
или

string.find(str,"%.")

символ процента отменяет магию
Ответить | Ответить с цитатой | Цитировать
# dmitrii 16.01.2019 17:21
string.find (str, ".",1, true)
Ответить | Ответить с цитатой | Цитировать
# kalikazandr 14.05.2019 15:57
Здравствуйте.
Есть путь к файлу:
"C:\Test\125.50\test.lua"
нужно получить таблицу:
return {
"C:",
"Test",
"125.50", -- вот эта папка не обязательно содержит точку
"test.lua"
}
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


Защитный код
Обновить

Архив QLua