如何使用JavaScript正则保留数字、数学运算符等运算字符
JavaScript结合正则实现混杂文本运算表达式清洗
实现思路
核心逻辑不需要复杂语法解析,按规则过滤+格式规范化即可实现,天然支持括号嵌套要求:
- 第一步:设置字符白名单,所有不在白名单内的无关字符直接过滤
- 第二步:清理冗余空格,可选做乘号统一、括号层级校验
白名单保留字符范围: - 数字0-9
- 运算符:
+、-、*、/,以及乘法的x/X写法 - 特殊符号:
$、.、(、)、半角空格
核心实现代码
function cleanMathExpression(input) { // 过滤所有不在白名单内的字符 let output = input.replace(/[^0-9+\-xX*\/$.()\s]/g, ''); // 合并连续空格为单个,去除首尾空格 output = output.replace(/\s+/g, ' ').trim(); // 可选:统一乘号格式,将作为运算符的x/X替换为*,避免孤立x残留 output = output.replace(/(?<=[\d$)])\s*[xX]\s*(?=[\d$(])/g, '*'); // 可选:括号嵌套层级校验,默认限制最多2层 let currentDepth = 0; let maxDepth = 0; for (const c of output) { if (c === '(') { currentDepth++; maxDepth = Math.max(maxDepth, currentDepth); } if (c === ')') currentDepth--; if (currentDepth < 0) break; // 右括号多于左括号时可按需做错误处理 } if (maxDepth > 2) console.warn('表达式括号嵌套超过2层,请核对输入'); return output; }
效果测试
传入示例输入运行:
const testInput = '((5 dogs + 2 cats) * $3.00 per animal) + $20 flat fee'; console.log(cleanMathExpression(testInput)); // 运行输出:((5 + 2) * $3.00) + $20
注:你给出的目标输出开头遗漏了一个左括号,上述输出括号和输入完全匹配,左右括号数量对齐,表达式语法合法。
嵌套支持说明
字符过滤逻辑不会修改括号的位置和数量,天然支持任意层级的括号嵌套,上述代码中的层级校验为可选逻辑,不需要可以直接删除,无论是单层还是多层括号嵌套都可以正常处理。
内容的提问来源于stack exchange,提问作者Alan M.
相关产品推荐
相关产品推荐

