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