【问题标题】:Creating a search pattern in Lua to find substring在 Lua 中创建搜索模式以查找子字符串
【发布时间】:2014-04-02 02:26:24
【问题描述】:

我正在尝试创建一个 Lua 模式,它可以帮助我在 docblock 或类似的多行字符串/注释中检索版本号。

现在是这样的:

s = [[/** 
      * Let's pretend this is a random docblock...
      * 
      * Very special line, super cool. Does many things.
      *
      * @version: 1.2.3
      * @author: Unknown
      */]]

local match = string.match(s, "@version%p%s%d%p%d")
print(match)

运行此代码产生:

@version: 1.2

我真正想要的是一种能够匹配任何通用版本编号的模式,而这正是我碰壁的地方,因为 Regex 和 Lua 模式是我似乎从未学习过的东西。这对 Lua 模式和 string.match 函数有可能吗?

(如果您有“模式/正则表达式的傻瓜指南”,您将永远欠您的债)

【问题讨论】:

  • Tutorial 在 lua 用户。你可以尝试匹配@version%p%s+[^\n]+
  • 或者你可以直接查看LuaDoc
  • @hjpotter92 谢谢!我会查找 LuaDoc,但这仅适用于特定于 Lua 的 cmets,对吗?我的主要项目是读取大型 php 文件并从 docblock 中获取它们的版本号,LuaDoc 可以帮忙吗?
  • 应该有类似的php代码文档生成器。

标签: lua


【解决方案1】:

请注意,“将匹配任何常见的”非常广泛!但是如果您不需要处理版本号,例如您只想打印每个文件的版本行,那么您只需要这样:

local match = string.match(s, "@version:.-\n")
print(match) -- @version: 1.2.3rc1\n

你必须使用.- 而不是.*,因为你的字符串有换行符,如果你不这样做,匹配将延伸到字符串的末尾。

如果你真正想要的只是版本字符串本身,而“@version:”永远不会改变,那么你只需要这样:

local match = string.match(s, "@version:%s+(.-)")
print(match) -- prints 1.2.3rc1

如果你想要主要和次要版本号,那么你必须指定“任何常见的”:major.minor.patch,每个都有多个数字:

local match = string.match(s, "@version:%s+(%d+).(%d+).(%d+)(%w+)")
print(match) -- prints      1       2       3       rc1

【讨论】:

  • 恕我直言,"@version:%s+([^\r\n]*)" 会更好。
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2015-07-06
  • 2012-11-01
相关资源
最近更新 更多