当前位置:首页 > AI技术 > 正文内容

JavaScript高级应用:中使用递归解析嵌套括号并实现区间逻辑判断的完整方案实战案例 |Duuu笔记

admin6个月前 (04-22)AI技术232

本文介绍一种将自定义区间表达式(如 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 引擎自身负责括号匹配与运算符优先级)。

以下是核心实现:

刺鸟创客

一款专业高效稳定的AI内容创作平台

下载

const inRange = (num, str) => {

// 定义安全的语法映射规则(顺序敏感!)

const subs = [

['&', ' && '], // 逻辑与 → JS &&

[/(?<=(?:\D|^))\.\.\.(\d+)/g, 'num <= $1'], // "...100" → "num <= 100"

[/(\d+)\.\.\.(?=(?:\D|$))/g, 'num >= $1'], // "0..." → "num >= 0"

[/(\d+)\.\.\.(\d+)/g, '$1 <= num && num <= $2'], // "0...100" → "0 <= num && num <= 100"

[',', ' || '], // 逻辑或 → JS ||

['[', ' ( '], // 左括号 → 左圆括号(提升分组优先级)

[']', ' ) '] // 右括号 → 右圆括号

];

// 逐条应用替换规则

for (const [from, to] of subs) {

str = typeof from === 'string'

? str.replaceAll(from, to)

: str.replaceAll(from, to);

}

// 调试时可取消注释以查看生成的表达式

// console.log('Generated expression:', str);

try {

// 使用 Function 构造器动态编译(比 eval 更安全:无闭包污染、作用域隔离)

const fn = new Function('num', 'return ' + str);

return fn(num);

} catch (e) {

throw new Error(`Invalid range expression: "${str}" → ${e.message}`);

}

};

✅ 关键设计说明

替换顺序至关重要

:先处理 & 和 , 避免干扰 ... 的正则匹配;... 的三种变体需按「边界锚定」顺序(...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免费学习笔记(深入)

”;

标签: PHP编程技术

相关文章

深入理解优化:如何利用 Gemini 3.1 的阶梯计费策略?企业级大规模调用实务完全指南|Duuu笔记

需深入理解Gemini 3.1阶梯计费与调用联动关系,通过识别阶梯区间、请求级Token预估截断、多模型路由调度、响应缓存去重、项目拆分配额绑定五种路径优化成本。 ☞☞☞AI 智能聊天, 问答助手,...

深入理解前端开发:Minimax 视频生成中负面提示词(Negative Prompt)写法完全指南|Duuu笔记

Minimax视频生成中负面提示词需用英文、逗号分隔,支持权重调节(如(blurry:1.3)),按构图/主体/画质/风格四类精简选取,禁用not/no/中文及违规词,须通过A/B测试验证有效性。...

AI高级应用:Perplexity 怎么写用户手册 Perplexity 产品帮助文档生成【技术】实战案例|Duuu笔记

Perplexity AI用户手册需基于API元数据、真实UI截图、典型场景示例、响应字段解析及动态调试指令五步构建:一调用API获取参数与错误码;二标注网页端搜索框、引用图标等组件;三设计信息检索、...

前端开发高级应用:Minimax视频生成提示词中文还是英文好实战案例|Duuu笔记

优先使用英文提示词,因其更契合模型训练语料并能稳定触发视觉特征;其次可采用中英混合策略兼顾文化专有名词;纯中文适用于强本土化场景;最终需通过多指标对比验证最优语言形式。 ☞☞☞AI 智能聊天, 问答...

深入理解前端开发:零基础教程:怎么用 Gemini 自动生成短视频脚本与拍摄大纲完全指南|Duuu笔记

需明确输入指令、理解输出逻辑并合理拆解内容:一、构建含角色/任务/格式等要素的提示词;二、追加分镜与时间轴约束优化专业性;三、转译为带道具编号与颜色标记的执行清单;四、用Gemini校验注意力断点并迭...

前端开发高级应用:骡子快跑支持日程安排吗 骡子快跑时间管理助手用法实战案例|Duuu笔记

骡子快跑具备日程安排能力,可通过计算机模式构建长效日程代理、自然语言注入日历事件、绑定外部日历实现双向同步三种方式实现。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。