【问题标题】:A regex I don't understand我不明白的正则表达式
【发布时间】:2011-08-06 12:15:43
【问题描述】:

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

【问题讨论】:

  • 提供一个示例输入字符串,我们可以告诉你它在做什么?
  • 理解 Lua 模式的关键是它们实际上不是“正则表达式”。它们相似,但语法和语义都不同,足以引起混淆。虽然听起来很傻,但学会称它们为“模式”而不是“正则表达式”可能会帮助你提高理解能力,让你有一个有空间思考差异的心智模型。之后,很容易记住%是模式中的转义字符,而在正则表达式中是``;模式中没有交替,等等。

标签: regex lua lua-patterns luadoc


【解决方案1】:
h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.tex)$", "%1")

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

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

【讨论】:

  • 你的假设完全正确,主要是让我感到困惑。
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2016-02-29
  • 2018-08-16
相关资源
最近更新 更多