在 android 上将 SQL glob 样式模式转换为正则表达式的最佳方法是什么



我正在为android做一个T9风格的拨号器。代码的工作原理是根据最终传递给联系人解析器的数字键设置一个glob模式。例如,键盘序列给出(例如简化的)模式:

[. 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 :-(");
}

这个想法是将glob字符串转换为正则表达式,在本例中:

[JKL]{1}[DEF]{1}[DEF]{1}

然而,我有麻烦让这个工作。这似乎是OK的一个单一的序列,但不是更长时间。它也可能被序列中的UTF-8编码字符所混淆。5的序列实际上是:

"[5JKLu0134u0135u01f0u0136u0137u01e8u01e9u1e30u1e31u1e32u1e33u1e34u1e35u212au0139u013au013bu013cu013du013eu1e36u1e37u1e38u1e39u1e3au1e3bu1e3cu1e3d]"

解释所有带有重音之类的名称的变体。这就是为什么我添加了/Q和/E转义,以确保它全部处理。在Android的java中是否有更简单的方法来实现这一点?

如果您不反对使用旧的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
    }

相关内容

最新更新