一个正则表达式,我不明白

h0b*_*0b0 9 regex lua lua-patterns luadoc

我正在主演这些来自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
Run Code Online (Sandbox Code Playgroud)

第5行会发生什么?

JUS*_*ION 14

h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")
Run Code Online (Sandbox Code Playgroud)

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

现在什么可能会让你感到困惑,那就是.匹配任何角色.但是当通过终止修改时-,意味着"在下一次匹配之前最短的零个或多个字符串" - 即非贪婪的搜索.它将匹配从字符串开头找到的任何字符,直到找到与复合[%w_]字符匹配的字符 - 字母数字或下划线.