NecharUtils.contain(物品列表匹配封装)
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 搜索匹配调用侧封装(静态工具) |
| 实现类 | net.moecraft.nechar.NecharUtils |
| 签名 | public static boolean contain(String sourseText, String searchText, Boolean enableSpecialSearch) |
| 调用方 | 默认搜索过滤器、Tooltip 搜索过滤器 |
该类只对外暴露 contain 一个方法(其余为 private),是物品列表搜索路径上唯一进入 PinIn 引擎的入口。
执行流程
| 步骤 | 处理 | 说明 |
|---|---|---|
| 1 | replaceExtraChars 预处理 |
对 sourseText 与 searchText 双向调用 |
| 2 | 忽略数字千分位逗号 | 条件:enableIgnoreComma 为 true 且 searchText 不含 , → 对两个文本都调用 deleteComma |
| 3 | 常规拼音匹配 | if (CONTEXT.contains(sourseText, searchText)) return true; |
| 4 | 电压特殊搜索短路 | if (!enableSpecialSearch) return false; —— 开关关闭时到此结束 |
| 5 | 双方转小写 | sourseText / searchText 均 toLowerCase() |
| 6 | 先试 zpm 与 max |
任一命中即返回 true |
| 7 | 前置校验 | 若 sourseText 与 searchText 都不含 v → 直接返回 false(源码注释:可能很慢,只尝试找到一个电压等级) |
| 8 | 遍历 13 个带 V 的电压等级 |
voltageListWithLetterV 任一命中即返回 true,否则 false |
deleteComma(String)
正则 (?<=[0-9]),(?=[0-9]) 全局替换为空 —— 只删除两侧都是数字的逗号(千分位分隔符),不会误伤文本中作为标点的逗号。
replaceExtraChars(String)
把部分由**代理对(surrogate pair)**表示的私用区字形归一化为 CustomDictLoader 中登记的单字符码位,使拼音词典能正确识别。按判定的首个代理字符分两组:
| 触发条件 | 替换映射(代理对 → 单字符码位) |
|---|---|
str.contains("\ud872") |
\ud872\udf3b→\ue900、\ud872\udf4a→\ue901、\ud872\udf73→\ue902、\ud872\udf5b→\ue903、\ud872\udf76→\ue904、\ud872\udf2d→\ue907 |
str.contains("\ud86d") |
\ud86d\udffc→\ue906、\ud86d\udce7→\ue90a、\ud86d\udff7→\ue90c |
对应词条见 拼音词典扩展。注意:词典中另有 \u9fcf、\u9fd4、\u9fed、\u9fec、\u9feb 五个码位本身就在 BMP 内(本身就是私用区字符),无需代理对归一化,因此不在此替换表中。
电压特殊搜索
containWithVoltage(String voltage, String sourseText, String searchText)
对单个电压等级做"跳过该电压词的拼音匹配":
| 步骤 | 条件 | 结果 |
|---|---|---|
| 1 | !searchText.contains(voltage) |
false(搜索词里没有这个电压等级) |
| 2 | !sourseText.contains(voltage) |
false(原文里找不到这个电压等级) |
| 3 | sList = searchText.split(voltage, 2),若 sList.length == 2 且 !CONTEXT.contains(sourseText, sList[1]) |
false(电压词之后的残余文本匹配不上) |
| 4 | 其余 | return CONTEXT.contains(sourseText, sList[0]) ——只匹配电压词之前的残余文本 |
典型场景:物品名 128V 电力机器、搜索词 128 电力机器——split("v", 2) 把搜索词切成 128 与 电力机器,只要求原文包含 128 。
电压等级表
| 位置 | 常量 | 包含的等级 |
|---|---|---|
| 先行单独尝试(步骤 6) | 无 v 后缀 |
zpm、max |
| 循环尝试(步骤 8) | voltageListWithLetterV |
ulv、lv、mv、hv、ev、iv、luv、uv、uhv、uev、uiv、umv、uxv |
源码注释明确标注该分支"可能很慢",且循环最多匹配 1 个电压等级(命中即 return true)。开关为 enableSpecialSearch 形参:物品名路径传 enableVoltageSpecialSearchName,提示文本路径传 enableVoltageSpecialSearchTooltips(见 配置系统)。
相关条目
- 匹配核心 Match -
CONTEXT.contains的最终实现 - 拼音词典扩展 - 被
replaceExtraChars归一化的字形词典 - 默认搜索过滤器 - 传
enableVoltageSpecialSearchName - Tooltip 搜索过滤器 - 传
enableVoltageSpecialSearchTooltips - 配置系统 -
enableIgnoreComma与两个电压开关