Lua模式匹配:定界捕获

4

我正在尝试解析类似于:&1 第一 &2 第二 &4 第四 \\的字符串,并从中构建一个表格。

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 吗?有人能解释一下我的错误吗?


3
尝试使用s:gmatch'&(%d+)([^&]*)' - Egor Skriptunoff
哦,感谢!这里 ([^&]*) 匹配的是不包含 & 的最长字符序列,对吗? - Scott H.
1
@EgorSkriptunoff,在“添加评论”下面有一个大文本框,您可以在那里输入您的答案 ;) - Paul Kulchenko
2个回答

2
  1. &(%d+)(.-)& 匹配 &1 first &
  2. 留下 2 second &4 fourth \\ 待匹配
  3. 您的模式不再匹配任何其他项目

所以一旦找到整个模式,它就会被完全消耗掉。现在明白了,谢谢。 - Scott H.

1

如果您知道值只有一个单词,那么这个方法应该有效:

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

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

谢谢保罗,要捕捉的材料相对任意不幸。 - Scott H.
然后您可以按照@Egor的解决方案并去除尾随空格(如果需要)。 - Paul Kulchenko

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