
本文介绍一种将自定义区间表达式(如 0...100 & [70...80, 0...100] & 30...50)安全、可扩展地转换为可执行 javascript 逻辑的方法,支持任意深度嵌套方括号 [...],无需手动递归解析,兼顾简洁性与健壮性。
本文介绍一种将自定义区间表达式(如 0...100 & [70...80, 0...100] & 30...50)安全、可扩展地转换为可执行 javascript 逻辑的方法,支持任意深度嵌套方括号 [...],无需手动递归解析,兼顾简洁性与健壮性。
在实际业务中,我们常需用简洁字符串描述复杂的数值范围条件(例如权限阈值、配置校验规则等),如 "0...100 & [70...80, 0...100] & 30...50"——它语义为:“数值必须同时满足:在 0–100 内,且(在 70–80 或 0–100 中),且在 30–50 内”。这类表达式天然具备嵌套结构,若强行用正则+循环逐层提取括号内容(如原问题中尝试的 depthPerIndex 手动栈管理),极易因边界错位、转义遗漏或优先级混乱而失败。
更优解是语义转换法:不直接“解析括号”,而是将整个字符串按预定义规则重写为合法 JavaScript 表达式,再通过受控方式求值。该方案规避了手工递归的复杂性,同时天然支持任意嵌套层级(因为 JS 引擎自身负责括号匹配与运算符优先级)。
以下是核心实现:
const inRange = (num, str) => {
// 定义安全的语法映射规则(顺序敏感!)
const subs = [
['&', ' && '], // 逻辑与 → JS &&
[/(?= $1'], // "0..." → "num >= 0"
[/(\d+)\.\.\.(\d+)/g, '$1 <h3>✅ 关键设计说明</h3>
- 替换顺序至关重要:先处理 & 和 , 避免干扰 ... 的正则匹配;... 的三种变体需按「边界锚定」顺序(...N、N...、N...M)排列,防止误匹配;
- 括号处理极简有效:[/] 直接映射为 ( ),利用 JS 原生运算符优先级实现逻辑分组,无需任何递归或栈操作;
- 安全性保障:使用 new Function() 而非 eval(),确保执行环境纯净(无外部变量访问),且输入字符串仅参与表达式构建,不执行任意代码;
- 错误防御:包裹 try/catch,对非法表达式(如括号不匹配、数字格式错误)提供清晰报错。
? 使用示例
console.log(inRange(75, "0...100 & [70...80, 0...100] & 30...50")); // false console.log(inRange(75, "0...100 & [70...80, 0...100] & 60...90")); // true console.log(inRange(5, "...10 & [2...8, 15...20]")); // true
⚠️ 注意事项
- 输入字符串中禁止出现未转义的单引号、反引号或换行符(否则破坏 Function 构造);
- 数值部分必须为纯数字(不支持科学计数法或负数前缀,如需扩展可增强正则);
- 若需支持更多运算符(如 ! 取反),应在 subs 中添加对应规则,并确保其优先级合理;
- 生产环境若对动态代码执行有严格限制,可改用 Acorn 等解析器做 AST 校验,但会显著增加复杂度。
此方案以“字符串即代码”的思维降维解决问题,将嵌套解析的算法难题转化为声明式语法映射,兼具可读性、可维护性与工程鲁棒性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











