使用Lua模式匹配的可选组捕获。

我正在尝试使用简单的模式匹配在 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 中有可选的捕获组。

点赞
用户1442917
用户1442917

不行;Lua 中的 模式项 并不将捕获列为可接受的选项,所以你不能像在 Perl 中一样使用 (%d*)?

2014-09-25 18:03:18
用户107090
用户107090

Lua 中没有可选捕获组。

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

请改用以下写法:

compound[atom] = tonumber(count) or 1

请注意,如果count是空字符串,tonumber将返回nil,这正是您想要检查的。

2014-09-25 18:03:25