匹配核心 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 未被本仓任何类调用,属于随上游一并移植的工具方法。

相关条目