/** * Sub-Store 节点名称属性注入脚本 (字典驱动架构版) * 核心逻辑:基于规则字典匹配节点特征,自动提取并注入网络属性至后缀前。 * 包含机制:前瞻正则匹配、幂等性校验、中缀注入。 * * 参考文档 (MDN RegExp): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp */ function operator(proxies) { // 1. 定义映射规则字典 (Rule Dictionary) // 采用数组形式以严格控制匹配优先级 (特例优先,通用兜底) // pattern: 匹配特征的正则表达式 (\b 用于确保单词边界,防止错配) // payload: 需要注入的属性内容 const rules = [ { pattern: /GTM\s*0\.5x/i, payload: "三网" }, // 匹配截图中的 GTM 0.5x { pattern: /GTM/i, payload: "三网" }, // 匹配截图中的 通用 GTM { pattern: /\bS1\b/i, payload: "广移" }, // 匹配截图中的 S1 { pattern: /\bS2\b/i, payload: "广电信" }, { pattern: /\bS3\b/i, payload: "广移" }, { pattern: /\bS4\b/i, payload: "广联通" }, { pattern: /\bBGP\b/i, payload: "cn2|5x" } // 新增:匹配 BGP 节点 ]; return proxies.map(p => { let name = p.name; let injectPayload = ""; // 2. 遍历规则字典,执行特征匹配 for (const rule of rules) { if (rule.pattern.test(name)) { injectPayload = rule.payload; break; // 命中最高优先级规则后立即熔断跳出 } } // 3. 边界处理:未命中任何规则,返回原节点以保证零副作用 if (!injectPayload) return p; // 4. 构建标准化注入片段 (例如: " [cn2|5x]") const formatStr = ` [${injectPayload}]`; // 5. 幂等性校验 (防 Bug 机制) // 如果节点名中已经包含了当前要注入的格式化字符串,则直接跳过,防止多次执行产生重复后缀 if (name.includes(formatStr)) { return p; } // 6. 执行中缀注入 (Infix Injection) // 匹配节点末尾的品牌标识 (允许前后有任意数量的空格,忽略大小写) // (.*)$ 用于捕获 SNTP 后面的所有内容(如果有的话) const suffixRegex = /(\s*-\s*SNTP.*)$/i; if (suffixRegex.test(name)) { // 命中后缀:使用 replace 方法,将注入片段放置在后缀 ($1) 之前 p.name = name.replace(suffixRegex, `${formatStr}$1`); } else { // 未命中后缀:作为纯净节点 (如 🇭🇰 HK-BGP-1),直接在字符串最末尾追加 p.name = name + formatStr; } return p; // 返回处理后的节点对象 }); }