java在安卓上将SQL全局样式模式转换为正则表达式的最佳方式是什么
我正在对安卓的T9型拨号器进行黑客攻击。该代码的工作原理是基于数字键设置全局模式,最终将数字键传递给触点解析器。例如,键盘序列给出了(例如简化的)模式:
[JKL][DEF][DEF]
这个很好用。不过,我还想突出显示UI中匹配的字母。我一直在尝试使用以下代码执行此操作:
String filter = createFilter(pattern);
String filterAsRegex = filter.replaceAll("\\[", "[\\\\Q").replaceAll("\\]", "\\\\E]{1}");
Log.i("nextMatch", "using filter: "+filter+" to a regex: " + filterAsRegex);
Pattern p = Pattern.compile(filterAsRegex);
Matcher m = p.matcher(n);
if (m.find()) {
result[0] = n.indexOf(m.group());
} else {
Log.i("nextMatch", "no matches :-(");
}
其思想是将全局字符串转换为正则表达式,在本例中:
[JKL]{1}[DEF]{1}[DEF]{1}
但是我很难让它正常工作。对于单个序列似乎可以,但对于任何更长的序列都不行。它也可能被序列中的UTF-8编码字符所混淆。5的顺序实际上是:
"[5JKL\u0134\u0135\u01f0\u0136\u0137\u01e8\u01e9\u1e30\u1e31\u1e32\u1e33\u1e34\u1e35\u212a\u0139\u013a\u013b\u013c\u013d\u013e\u1e36\u1e37\u1e38\u1e39\u1e3a\u1e3b\u1e3c\u1e3d]"
说明所有带有重音等的名称变体。这就是为什么我添加了/Q和/E转义,以确保它得到了处理。在Android的java中有没有更简单的方法来实现这一点
# 1 楼答案
如果您不反对使用一个好的老Apache项目,那么您可以始终在应用程序中包含ORO(它像往常一样获得Apache许可)。不幸的是,现在它在阁楼上,但是2.0。x版本是稳定的,在Android上运行良好,没有任何额外的积垢