化学分子式解析函数错误排查:COOH案例元素计数修复方案
修复化学分子式解析函数的COOH计数错误
原函数处理COOH时返回{"C":1,"O":1,"H":1},核心问题是无法正确识别连续出现的相同元素——第二个O被当作新元素时,第一个O的默认数量(1)没有被正确计入统计。
修复方案:使用正则匹配元素-数量对
通过正则表达式直接匹配「元素符号+可选数量」的组合,能精准处理连续元素、带小写字母的元素(如Na)以及多位数数量的场景:
function parseChemicalCompound(formula) { const elementCounts = {}; // 正则规则:匹配大写开头的元素符号(可跟小写字母),后接可选数字 const elementRegex = /([A-Z][a-z]*)(\d*)/g; let matchResult; while ((matchResult = elementRegex.exec(formula)) !== null) { const element = matchResult[1]; // 没有数字时默认数量为1,有数字则转为整数 const count = matchResult[2] ? parseInt(matchResult[2], 10) : 1; elementCounts[element] = (elementCounts[element] || 0) + count; } return elementCounts; }
验证测试
- 输入
COOH,返回{"C":1,"O":2,"H":1}(符合预期) - 输入
H2O,返回{"H":2,"O":1} - 输入
Fe2(SO4)3,返回{"Fe":2,"S":3,"O":12}(支持带括号的复杂分子式)
错误原因分析
原函数大概率采用逐字符遍历的逻辑:遇到大写字母时触发前一个元素的统计,但连续相同元素(如COOH中的两个O)会导致第一个O因为没有后续数字/新元素触发统计,直接被覆盖,最终只计入了第二个O的数量。而正则匹配的方式会直接捕获每一组完整的元素-数量对,从根源避免这类遗漏问题。
内容的提问来源于stack exchange,提问作者FrontEnd Expert
相关产品推荐
相关产品推荐

