可选组捕获与Lua模式匹配

10
我将尝试使用简单的模式匹配在Lua中解析化学式,但是我不知道如何指定一个可选的捕获组。这是我想出的模式:
pattern = "(%u%l*)(%d*)"

第一组捕获原子符号(即“H”,“He”等),第二组捕获分子中该原子的数量。这个值通常是整数,但如果它是1,则通常被省略,例如:

formula = "C2H6O"

当我尝试进行全局匹配时,如果没有匹配项,count的结果是'',而不是我预期的nil
compound = {}
for atom,count in string.gmatch(formula, pattern) do
    compound[atom] = count or 1
end

显然,我可以直接检查count = '',但我很好奇在Lua中是否有一个可选的捕获组。
2个回答

10
如果Lua中有可选捕获组。
不可以;模式项不列出捕获作为可接受的选项,因此您不能像在Perl中那样使用(%d*)?。请参阅模式项

2
谢谢,顺便说一句,ZeroBrane非常出色,这正是我目前在使用的 :) - Moop
感谢 Moop 的反馈! - Paul Kulchenko

4

在Lua中没有可选捕获组。

count 是空字符串而不是nil,因为空字符串匹配%d*

请尝试使用以下方法:

compound[atom] = tonumber(count) or 1

请注意,如果count是空字符串,则tonumber将返回nil,这就是您需要检查的内容。

我不明白当它匹配空字符串时你的意思是什么。你能再解释一下吗?难道任何东西 * 都可以匹配所有内容吗? - Moop
@Moop,%d* 表示 零个或多个数字 - lhf
@ihf 当然可以,但这是否意味着它匹配每个“空字符串”? - Moop
@Moop,%d*匹配空字符串,但不必以此结束;实际上,它匹配最长可能的数字字符串,如果没有,则匹配空字符串。 - lhf

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