【问题标题】:lua pattern matching: delimited captureslua 模式匹配:分隔捕获
【发布时间】:2013-06-10 10:07:43
【问题描述】:

我正在尝试解析一个字符串,例如:&1 first &2 second &4 fourth \\,并从中构建一个表

t = {1=first, 2=second, 4=fourth}

我一般对正则表达式不是很有经验,所以我的天真尝试(暂时忽略 \\ 和表格部分)是

local s = [[&1 first &2 second &4 fourth \\]]

for k,v in string.gmatch(s, "&(%d+)(.-)&") do
    print("k = "..k..", v = "..v)
end

当我期望看到两个捕获的对时,它只给出了第一个捕获的对。我做了一些阅读并找到了lpeg 库,但它对我来说非常陌生。这里需要lpeg 吗?谁能解释我的错误?

【问题讨论】:

  • 试试s:gmatch'&(%d+)([^&]*)'
  • @EgorSkriptunoff 啊哈,谢谢!这里([^&]*) 匹配不包含& 的最长字符序列对吗?
  • @EgorSkriptunoff,“添加评论”下有一个大文本框,您可以在其中输入答案;)

标签: lua pattern-matching lpeg


【解决方案1】:
  1. &(%d+)(.-)& 匹配 &1 first &
  2. 留下2 second &4 fourth \\ 进行匹配
  3. 您的模式与任何其他项目都不匹配

【讨论】:

  • 所以整个模式一旦被发现就被消耗掉。现在说得通了,谢谢。
【解决方案2】:

如果您知道这些值是一个单词,那么应该可以:

string.gmatch(s, "&(%d+)%s+([^%s&]+)")

取“&”,后跟 1 个或多个数字(捕获),后跟一个或多个空格,然后是一个或多个非空格、非 & 字符(捕获)。

【讨论】:

  • 谢谢保罗,不幸的是,要捕获的材料相对随意。
  • 然后您可以按照@Egor 的解决方案并去除尾随空格(如果需要)。
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2021-11-26
  • 2017-01-08
相关资源
最近更新 更多