验证 Clash 代理集合的筛选规则,不需要一次用完整订阅里的全部节点。官方语法是对名称做关键词或正则匹配、对 type 做字面量排除,因此用少量能代表“应保留 / 应排除 / 应不受影响”的名称和类型样例即可判断规则是否写对。
适用条件
适用于已起草 filter、exclude-filter 或 exclude-type,需要在写入正式集合前做对照的场合。样例名称应来自真实集合内容:http/file 的落盘 YAML(path 在 HomeDir 内,未填 path 时文件名为 url 的 MD5),或 inline 的 payload。也可用 payload 临时放几条仅用于核对的代理定义(http/file 解析失败时文档同样允许 payload 作备用)。不要用 health-check.url 或订阅 url 充当节点名。若还配置了 additional-prefix、additional-suffix、proxy-name、改 .name 的 override-expr,样例里要同时准备原名和覆写后的名字。
选取少量样例的方法
至少准备三类名称:一条你认为应被 filter 留下、一条应被 exclude-filter 丢掉、一条两者都不该误伤。若使用 exclude-type,再准备至少一种将被 | 列表排除的 type,以及一种应保留的 type。文档示例的 filter 为 "(?i)港|hk|hongkong|hong kong",样例就应覆盖带“港”、带 hk、大小写不同的 HK,以及完全不含这些片段的名称。exclude-filter 示例值为 xxx,则名称中含 xxx 的样例用于确认排除是否发生。exclude-type 示例为 ss|http,则类型字面量为 ss 或 http 的样例应被排除,其它类型不应仅因名称相似被去掉。样例条数保持很少,目的是覆盖规则分支,不是复制整份订阅。
对照语法做命中判断
对每个样例名称,按字面执行:是否满足 filter 的关键词或正则;多个正则以反引号分段时,逐段测试而不是整串一次编译。再看是否满足 exclude-filter。最后把该条的 type 与 exclude-type 中 | 分隔的片段做全等比较,不能把 exclude-type 当成正则。判断依据:应保留的样例必须能通过 filter(若已配置)、不被 exclude-filter 命中、且 type 不在排除列表中;应丢掉的样例必须在上述某一环节被明确拒绝。若只有覆写后的名称才能对上正则,把这一依赖记下来,避免只验证了下载原文。
失败时的下一步
若样例结果与预期不符,先改表达式再改节点源:检查是否漏写 (?i)、反引号是否把多段正则连成一段、exclude-type 是否误写了显示名而不是配置里的 type。不要靠反复跑 health-check 来验证筛选,延迟测试不解释名称是否匹配。样例全部通过后再应用到完整集合;若完整集合结果仍不对,回到落盘文件核对是否出现了样例未覆盖的新命名,而不是认定少量验证无效后直接放弃语法检查。