Регулярное выражение я не понимаю - PullRequest
9 голосов
/ 15 апреля 2011

Я играю главную роль в этих нескольких (слегка измененных) строках из luadoc, которые явно строят имя файла с полным путем. Но я просто не понимаю, что происходит в строке 5. Параметр filename может быть что-то вроде «myfile.lua».

function out_file (filename)
  local h = filename
  h = string.gsub(h, "lua$", "tex")
  h = string.gsub(h, "luadoc$", "tex")
  h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")
  return h
end

Что происходит в строке 5?

1 Ответ

14 голосов
/ 15 апреля 2011
h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")

Шаблон соответствует любой строке, которая начинается с нуля или более не алфавитно-цифровых символов (т. Е. Пробелов и т. Д.), За которыми следуют один или несколько буквенно-цифровых символов и символов подчеркивания (возможно, имени файла), точка и строка «tex», которая затем заканчивается. Он захватывает имя файла + ".tex" для дальнейшего использования. По сути, он берет имя файла с возможными ненужными символами (пробелами) в начале и заменяет его чистой версией перед тем, как прикрепить выходной каталог к ​​передней части.

Теперь, вероятно, вас смущает то, что . соответствует любому персонажу. Но при изменении с помощью завершающего - это означает «самую короткую строку из нуля или более символов перед следующим соответствием», то есть не жадный поиск. Он будет совпадать с любыми символами, найденными в начале строки, до тех пор, пока не найдет что-то, соответствующее составу [%w_] & ndash; буквенно-цифровой или подчеркивание.

...