如何用Dart将化学方程式中符合条件的数字转换为下标?
Dart 实现化学方程式数字转下标函数
核心思路
用正则后发断言精准匹配需要转换的数字,再通过字符映射将普通数字替换为下标数字。匹配规则:仅当数字前是字母、下标数字或右括号)时才转换。
实现代码
String convertChemicalSubscripts(String input) { // 普通数字到下标数字的映射 const subscriptMap = { '0': '₀', '1': '₁', '2': '₂', '3': '₃', '4': '₄', '5': '₅', '6': '₆', '7': '₇', '8': '₈', '9': '₉', }; // 正则表达式:匹配前面是字母、下标数字或右括号的数字 // (?<=[a-zA-Z₀-₉)]) 是后发断言,检查当前数字的前一个字符符合条件 // \d 匹配单个数字 final regex = RegExp(r'(?<=[a-zA-Z₀-₉)])\d'); // 替换匹配到的数字为对应下标 return input.replaceAllMapped(regex, (match) { final digit = match.group(0)!; return subscriptMap[digit]!; }); } // 测试案例 void main() { print(convertChemicalSubscripts('2H2 + O2 -> 2H2O')); // 输出:2H₂ + O₂ -> 2H₂O print(convertChemicalSubscripts('(H2O)3')); // 输出:(H₂O)₃ print(convertChemicalSubscripts('Fe2(SO4)3')); // 输出:Fe₂(SO₄)₃ print(convertChemicalSubscripts('H22O')); // 输出:H₂₂O }
代码说明
- 正则表达式:
(?<=[a-zA-Z₀-₉)])\d确保只转换符合条件的数字:(?<=[a-zA-Z₀-₉)]):后发断言,限定数字前的字符必须是字母(大小写)、已转换的下标数字或右括号\d:匹配单个0-9的数字
- 字符映射:通过
subscriptMap直接将普通数字映射为Unicode下标字符,无需额外处理编码 - replaceAllMapped:遍历所有匹配结果,逐个替换为对应下标数字
边界情况验证
- 开头的数字(如
2H2中的第一个2):因为前面没有字符,不匹配正则,不会转换 - 括号后的数字(如
(H2O)3中的3):前面是右括号,符合条件,正常转换 - 下标后的数字(如
H22中的第二个2):前面是下标数字₂,符合条件,转换为₂₂
内容的提问来源于stack exchange,提问作者sineya phiri
相关产品推荐
相关产品推荐

