如何将数学公式字符串拆分为由各独立元素组成的数组
公式字符串拆分实现方案
这类拆分本质是简单的词法标记(Token)拆分,核心逻辑是按字符类型分组,把连续的同类型字符(字母/数字)合并为一个标记,单独的符号类字符直接作为独立标记即可。
实现思路
- 先定义需要识别的单字符符号列表:
=,+,-,*,(,),这类字符每个都单独作为一个拆分项 - 连续的字母字符(a-z/A-Z)合并为一个标识符项
- 连续的数字字符合并为一个数值项
- 遍历字符串逐个字符判断类型,遇到类型切换时就把之前缓存的连续字符存入结果数组,重置缓存继续处理
代码实现示例
完整逻辑实现(JavaScript,可扩展)
适合后续需要新增识别规则(比如支持小数、下划线变量、多字符运算符等)的场景:
function splitFormula(formulaStr) { const result = []; let currentToken = ''; // 定义单字符符号集合 const symbols = new Set(['=', '+', '-', '*', '(', ')']); for (const char of formulaStr) { if (symbols.has(char)) { // 遇到符号,先把之前攒的非符号token存入结果 if (currentToken) { result.push(currentToken); currentToken = ''; } // 符号本身作为单独token存入 result.push(char); } else if (/[a-zA-Z]/.test(char)) { // 当前是字母,如果之前攒的是数字,先把数字存了 if (currentToken && /\d/.test(currentToken[0])) { result.push(currentToken); currentToken = ''; } currentToken += char; } else if (/\d/.test(char)) { // 当前是数字,如果之前攒的是字母,先把字母存了 if (currentToken && /[a-zA-Z]/.test(currentToken[0])) { result.push(currentToken); currentToken = ''; } currentToken += char; } // 如果公式包含空格,可在这里加判断直接跳过空格字符 } // 遍历结束后把最后剩下的token存入 if (currentToken) { result.push(currentToken); } return result; } // 测试 const formula = "formula=today+Buy+yes-(25*2)-3"; console.log(splitFormula(formula)); // 输出:["formula","=","today","+","Buy","+","yes","-","(","25","*","2",")","-","3"]
正则简化实现
如果不需要复杂扩展,直接用正则匹配即可快速实现效果:
const formula = "formula=today+Buy+yes-(25*2)-3"; const result = formula.match(/[a-zA-Z]+|\d+|[=+*()-]/g);
正则解释:匹配连续字母、连续数字、或者指定的单个符号,
g修饰符表示全局匹配所有符合规则的片段。
其他语言适配逻辑
不管用什么语言实现,核心逻辑完全一致:
- 遍历字符判断所属类型
- 同类型连续字符拼接,不同类型切换时完成一次token存储
- 需要支持更复杂的公式规则时,只需要对应调整类型判断规则和符号列表即可。
内容的提问来源于stack exchange,提问作者May
相关产品推荐
相关产品推荐

