先列出筛选前的候选集合
核对筛选前后的节点集合,必须先有筛选前的清单,否则无法说明 filter 改变了什么。筛选前的候选来自文档中的引入方式:proxies 列出的出站代理或其他策略组;use 引入的代理集合;include-all 引入的全部出站代理以及代理集合;include-all-proxies 引入的全部出站代理;include-all-providers 引入的全部代理集合。后三类引入顺序将按照名称排序。include-all 引入不包含策略组,策略组只能出现在 proxies 里。
适用条件是:你要核对某一个策略组在应用 filter、exclude-filter、exclude-type 之后还剩哪些节点。判断依据是作用范围。filter 仅作用于引入代理集合以及引入所有出站代理。因此筛选前集合要拆成两段来抄:一段是会进入名称筛选的节点,另一段是仅由 proxies 直接引入、不按该筛选字段处理的成员。把两段混在一张表里,就会出现「表达式明明不匹配却仍在组内」的假冲突,核对无法收束。
再按过滤顺序得到筛选后集合
具体操作按先引入、再留下、再排除来核对。
对会进入名称筛选的那一段,先保留满足 filter 的名字。filter 可以使用关键词或正则,也可用反引号区分多个正则。文档示例会留下名称匹配港、hk、hongkong、hong kong 的节点。再从留下的结果中去掉满足 exclude-filter 的名字,示例会去掉含美或日的名称。然后仅对引入出站代理得到的节点应用 exclude-type:该字段不支持正则,用 | 分割类型,无视大小写。代理集合侧不要用类型排除去解释缺失。proxies 里引入的其他策略组保持原样进入组,不参与上述名称筛选。
核对时采用集合对比:筛选前名单减去未通过 filter 的,再减去 exclude-filter 命中的,再减去类型排除命中的(仅限适用对象),得到筛选后名单。两边都应使用完全相同的字符串,包括空格与大小写,因为匹配基于名称文本。若筛选后为空,再看 empty-fallback:空组时回退到指定 proxy 名称,不能填写代理组。回退对象不是筛选后的节点集合成员,不要把它写进筛选后集合里充数。default-selected 只在组内选择默认节点,为空或节点名不存在时选择组中第一个节点,它也不负责生成筛选集合。
对不上时回到作用范围和类型排除
若筛选后集合与配置语义不一致,先判断是不是看错了检查项。健康检查的 url 只会检查 proxies 字段的代理,不会检查通过 use 引入的代理集合中的代理。interval、lazy、timeout、max-failed-times、expected-status 只说明何时测试以及怎样根据 HTTP 状态判断可用,不增加也不删除筛选集合里的名字。可用节点集合可以小于组成员集合,这不属于筛选核对失败。
下一步把引入开关逐项对照:只开 include-all-proxies 时,进入名称筛选的候选应只有出站代理;只开 include-all-providers 时,候选应只有集合中的节点,且该开关会使原来的 use 引入失效。确认后再只改 filter 或只改 exclude-filter,一次只变动一个条件,避免无法判断是哪一条表达式改变了集合。若名称含特殊符号,核对引号是否按名字字段的要求包裹,防止比较的是两份不同字符串。完成对照后,筛选前集合、筛选后集合、空组回退对象应分别对应到引入字段、筛选字段与 empty-fallback,而不是混成一份无法解释的名单。