有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    如果您不反对使用一个好的老Apache项目,那么您可以始终在应用程序中包含ORO(它像往常一样获得Apache许可)。不幸的是,现在它在阁楼上,但是2.0。x版本是稳定的,在Android上运行良好,没有任何额外的积垢

        GlobCompiler gc = new GlobCompiler();
        try {
            Perl5Pattern pattern = (Perl5Pattern) gc.compile("[JKL][DEF][DEF]");
            Perl5Matcher matcher = new Perl5Matcher();
            String straw = "JEEVES";
            if (matcher.matchesPrefix(straw, pattern)) {
                MatchResult res = matcher.getMatch();
                for (int i = 0; i < res.groups(); i++) {
                    String s = straw.substring(res.beginOffset(i), res.endOffset(i));
                    // 's' now contains a the match of group #i
                }
            } else {
                // No match
            }
        } catch (MalformedPatternException e) {
            // Oh noes
        }