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

相关条目