Регулярное выражение я не понимаю

Я играю главную роль в этих нескольких (слегка измененных) строках из 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 ответ

Решение
h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")

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

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

Другие вопросы по тегам