【问题标题】:Matching an optional number in a Lua pattern匹配 Lua 模式中的可选数字
【发布时间】:2014-11-10 23:22:06
【问题描述】:

我正在解析 diff3 命令的输出,有些行如下所示:

1:1,2c
2:0a

我对中间的数字很感兴趣。它可以是单个数字,也可以是用逗号分隔的一对数字。使用正则表达式,我可以像这样捕获它们:

/^\d+:(\d+)(?:,(\d+))?[ac]$/

Lua 中最简单的等价物是什么?由于可选的第二个数字,我无法将该正则表达式的直接翻译传递给 string.match。

【问题讨论】:

  • 逗号充当第一个数字(始终存在)和第二个数字(可选)之间的分隔符
  • @AvinashRaj:这个问题是针对 Lua 的,它在 stdlib 中没有标准的正则表达式。

标签: regex lua lpeg


【解决方案1】:

使用 lua 模式,您可以使用以下内容:

^%d+:(%d+),?(%d*)[ac]$

例子:

local n,m = string.match("1:2,3c", "^%d+:(%d+),?(%d*)[ac]$")
print(n,m) --> 2    3

local n,m = string.match("2:0a", "^%d+:(%d+),?(%d*)[ac]$")
print(n,m) --> 0

【讨论】:

    【解决方案2】:

    你也可以使用 lua 模式来实现它:

    local num = str:match '^%d+:(%d+),%d+[ac]$' or str:match '^%d+:(%d+)[ac]$'
    

    【讨论】:

    • 如果我需要像local n,m = ... 那样捕获两个数字,则此单行代码不起作用。不过,复制和粘贴模式是一件简单的事情,但我却想不通。
    • @hugomg 您可以将第二个数字组设置为%d-(或%d*)以匹配0 的出现次数。
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多