9

我正在关注 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 行发生了什么?

4

1 回答 1

14
h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")

该模式匹配任何以零个或多个非字母数字字符(即空格等)开头的字符串,后跟一个或多个字母数字字符和下划线(可能是文件名)、句点和字符串“tex”,然后结束。它捕获文件名+“.tex”供以后使用。基本上,它在开头使用可能包含垃圾字符(空格)的文件名,并在将输出目录添加到其前面之前将其替换为干净版本。

现在可能导致您混淆的是.匹配任何字符。但是当被终止时-,这意味着“下一个匹配之前的零个或多个字符的最短字符串” - 即非贪婪搜索。它将匹配从字符串开头找到的任何字符,直到找到与复合词匹配的[%w_]字符——字母数字或下划线。

于 2011-04-15T17:27:45.430 回答