带有Lua模式匹配的可选组捕获

带有Lua模式匹配的可选组捕获,lua,lua-patterns,Lua,Lua Patterns,我试图用简单的模式匹配来解析Lua中的化学公式。但是,我不知道如何将捕获组指定为可选组。以下是我提出的模式: pattern=“(%u%l*)(%d*)” 第一组捕获原子符号(即“H”、“He”等),第二组捕获分子中该原子的数量。该值通常为整数值,但如果为1,则通常会忽略该值,例如: formula=“C2H6O” 当我尝试进行全局匹配时,如果没有匹配,count的结果是',而不是我预期的nil component={} 对于atom,在string.gmatch(公式、模式)中计数 化合物

我试图用简单的模式匹配来解析Lua中的化学公式。但是,我不知道如何将捕获组指定为可选组。以下是我提出的模式:

pattern=“(%u%l*)(%d*)”
第一组捕获原子符号(即“H”、“He”等),第二组捕获分子中该原子的数量。该值通常为整数值,但如果为1,则通常会忽略该值,例如:

formula=“C2H6O”
当我尝试进行全局匹配时,如果没有匹配,
count
的结果是
'
,而不是我预期的
nil

component={}
对于atom,在string.gmatch(公式、模式)中计数
化合物[原子]=计数或1
结束
显然,我可以检查一下是否有
count='
,但我很好奇Lua中是否有可选的捕获组

如果Lua中有可选的捕获组


没有;不要将捕获列为可接受的选项,例如,您不能像在Perl中那样拥有
(%d*)?

Lua中没有可选的捕获组

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

请尝试以下方法:

compound[atom] = tonumber(count) or 1

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

谢谢,ZeroBrane上的伟大工作,顺便说一句,这是我当前使用的:)感谢Moop的反馈!当它匹配空字符串时,我不明白你的意思。你能解释一下吗?任何东西*都不匹配吗?@Moop,
%d*
表示零位或更多位。@ihf当然,但这不意味着它匹配每个“空字符串”@Moop,
%d*
匹配空字符串,但不必在那里结束;事实上,它匹配可能最长的数字字符串,如果没有,则匹配“无”。