一个我不理解的正则表达式

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行发生了什么事情?

提供一个示例输入字符串,我们可以告诉您它正在做什么? - user177800
理解Lua模式的关键在于它们实际上并不是“正则表达式”。它们类似,但语法和语义都有足够的差异会引起混淆。虽然听起来很傻,但学会称它们为“模式”而不是“正则表达式”可能会帮助您通过提供一个可以思考差异的心理模型来提高您的理解能力。之后,很容易记住是模式中的转义字符,而\是正则表达式中的转义字符;模式中没有交替等等。 - RBerteig
1个回答

14
h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")
该模式匹配任何以零个或多个非字母数字字符(即空格等)开头,后跟一个或多个字母数字字符和下划线(可能是文件名),加上句点和字符串“tex”,然后结束的字符串。它捕获文件名 +“ .tex”,供以后使用。基本上,它将可能包含垃圾字符(空格)的文件名替换为干净版本,然后将输出目录附加到其前面。
现在让你感到困惑的可能是 . 匹配任何字符。但是当通过终止 - 进行修改时,它的意思是“在下一个匹配之前的零个或多个字符中最短的字符串”——即非贪婪搜索。它将匹配从字符串开头找到的任何字符,直到它找到与复合 [%w_] 匹配的内容——字母数字或下划线。

你的假设是绝对正确的,这正是让我感到困惑的主要原因。 - h0b0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接