TransformerRegExp(正则匹配改写)
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 字节码转换器(可配置) |
| 实现类 | net.vfyjxf.nechar.transform.transformers.TransformerRegExp |
| 父类 | Transformer.Configurable |
getName() |
regular expression |
| 注册顺序 | 第 2 个(见 转换器注册表) |
| 来源 | 基于 Towdium 的 JustEnoughCharacters 1.12.0 版 TransformerRegExp.java 改写(MIT 协议) |
改写目标(2 个调用点)
1. Pattern.matcher
| 原调用 | 替换为 | 描述符 |
|---|---|---|
java/util/regex/Pattern.matcher(CharSequence)java/util/regex/Matcher(INVOKEVIRTUAL) |
net/vfyjxf/nechar/utils/Match.matcher(INVOKESTATIC) |
(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)Ljava/util/regex/Matcher; |
参数为 arg1 = null、arg2 = null —— 因为不处理 INVOKEDYNAMIC,只改写普通虚方法调用(该分支要求 arg1 != null && arg2 != null 才生效)。
2. String.matches
| 原调用 | 替换为 | 描述符 |
|---|---|---|
java/lang/String.matches(String)Z(INVOKEVIRTUAL) |
net/vfyjxf/nechar/utils/Match.matches(INVOKESTATIC) |
(Ljava/lang/String;Ljava/lang/CharSequence;)Z |
参数为 arg1 = "(Ljava/lang/Object;)Z"、arg2 = "(Ljava/lang/String;)Z" —— 非 null,因此同样会处理 INVOKEDYNAMIC 中以 Handle 形式出现的 String.matches 方法引用。
源码中两次调用连续执行,各自带自己的 transformInvoke 参数:
Transformer.transformInvoke(n, "java/util/regex/Pattern", "matcher",
"net/vfyjxf/nechar/utils/Match", "matcher",
"(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;",
false, Opcodes.INVOKESTATIC, null, null);
Transformer.transformInvoke(n, "java/lang/String", "matches",
"net/vfyjxf/nechar/utils/Match", "matches",
"(Ljava/lang/String;Ljava/lang/CharSequence;)Z",
false, Opcodes.INVOKESTATIC, "(Ljava/lang/Object;)Z", "(Ljava/lang/String;)Z");
效果
目标方法中所有正则匹配都会被换成 匹配核心 Match:
Match.matcher先按CASE_INSENSITIVE/UNICODE_CASE标志决定是否双方转小写,再退化为"剥离首尾.*的拼音子串匹配",并返回哑 Matcher(成功 →"a",失败 →"")。Match.matches同样把.*通配降级为拼音子串包含。
因此这些界面里的正则搜索框既保留原有的正则书写习惯,又能接受拼音输入。
配置数据源
| 抽象方法 | 返回 |
|---|---|
getDefault() |
NechConfig.defaultTransformerRegExp(4 项,见 默认转换目标列表) |
getAdditional() |
NechConfig.transformerRegExpAdditionalList(配置项 AdditionalTransformerRegExpList,默认空) |
| 黑名单 | NechConfig.transformerMethodBlackList(配置项 transformerMethodBlackList,默认空) |
与 TransformerString 的对比
| 对比项 | TransformerString | 本转换器 |
|---|---|---|
| 改写次数 | 1 处(String.contains) |
2 处(Pattern.matcher、String.matches) |
处理 INVOKEDYNAMIC |
是(arg1/arg2 均非 null) |
仅 String.matches 那处是;Pattern.matcher 传 null/null 不处理 |
| 默认目标数 | 22 项(21 唯一) | 4 项 |
getName() |
string contains |
regular expression |
相关条目
- 转换器注册表 - 注册顺序与
Configurable工作流 - 默认转换目标列表 - 本转换器默认改写哪些方法
- TransformerString - 姊妹转换器
- 匹配核心 Match - 被注入的
Match.matcher/Match.matches实现 - 配置系统 - 附加列表与黑名单配置项