匹配核心 Match
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 拼音/子串匹配核心工具类 |
| 实现类 | net.vfyjxf.nechar.utils.Match |
| 底层引擎 | me.towdium.pinin.PinIn(静态字段 NotEnoughCharacters.CONTEXT) |
| 来源 | 基于 Towdium 的 JustEnoughCharacters 1.12.0 版 Match.java 改写(MIT 协议) |
该类是被字节码改写注入的目标方法:其他模组原本调用的 String.contains、String.matches、Pattern.matcher 会被 ASM 换成这里的方法(见 TransformerString 与 TransformerRegExp)。
常量
| 名称 | 值 | 说明 |
|---|---|---|
p |
Pattern.compile("a") |
复用的哑正则,仅用于 matcher 返回一个不含任何字符的 Matcher |
方法
contains(String s, CharSequence cs)
return CONTEXT.contains(s, cs.toString());
纯转发到 PinIn 上下文,不做任何额外处理。这是 TransformerString 把 String.contains 换成的实现,也是 默认搜索过滤器 与 Tooltip 搜索过滤器 经由 NecharUtils.contain 最终落到的位置。
matches(String s1, String s2)
把"带 .* 通配的正则匹配"降级成"子串包含匹配",这样正则搜索也能享受拼音支持:
| 步骤 | 行为 |
|---|---|
| 1 | start = s2.startsWith(".*"),end = s2.endsWith(".*") |
| 2 | 保护:if (start && end && s2.length() < 4) end = false; ——当整个模式就是 .*(长度 < 4)时,丢弃尾部通配,避免退化为无条件匹配 |
| 3 | 剥离首尾的 .*:s2 = s2.substring(start ? 2 : 0, s2.length() - (end ? 2 : 0)) |
| 4 | return contains(s1, s2) |
该方法不处理 ^ / $ / 字符类 / 量词等真正的正则语法,只识别首尾的 .*;其余内容按字面子串交给拼音引擎。
matcher(Pattern test, CharSequence name)
为保持 Pattern.matcher 原有签名而存在的适配层:
| 条件 | 行为 |
|---|---|
test 带 CASE_INSENSITIVE 或 UNICODE_CASE 标志 |
两边 toLowerCase() 后调用 matches(...) |
| 其他情况 | 直接 matches(name.toString(), test.toString()) |
返回值为 result ? p.matcher("a") : p.matcher("") ——匹配成功时返回对 "a" 的 Matcher(恰好含 1 个字符),失败时返回对空串的 Matcher(0 个字符)。调用方若用 find()/matches() 判断,等价于返回布尔结果。
isChinese(两个重载)
| 方法 | 判定范围 |
|---|---|
isChinese(CharSequence s) |
从字符串末尾向前遍历,只要有一个字符命中即返回 true |
isChinese(char i) |
0x3000 <= i < 0xA000(CJK 统一表意文字等)或 0xE900 <= i < 0xEA00(本模组自定义的私用区拼音字形,见 拼音词典扩展) |
注:本模组源码中 isChinese 未被本仓任何类调用,属于随上游一并移植的工具方法。
相关条目
- NecharUtils.contain - 带电压特殊搜索与去逗号处理的调用侧封装
- 拼音词典扩展 -
CONTEXT的词典与模糊拼音设置 - TransformerString - 把
String.contains改写到本类的转换器 - TransformerRegExp - 把
String.matches/Pattern.matcher改写到本类的转换器 - 默认搜索过滤器 - 使用本类的物品名过滤器
- Tooltip 搜索过滤器 - 使用本类的提示文本过滤器