Java 什么';这是在android上将SQL全局样式模式转换为正则表达式的最佳方法

Java 什么';这是在android上将SQL全局样式模式转换为正则表达式的最佳方法,java,android,regex,Java,Android,Regex,我正在对android的T9型拨号器进行黑客攻击。该代码的工作原理是基于数字键设置全局模式,最终将数字键传递给触点解析器。例如,键盘序列给出了(例如简化的)模式: [JKL][DEF][DEF] 这个很好用。不过,我还想突出显示UI中匹配的字母。我一直在尝试使用以下代码执行此操作: String filter = createFilter(pattern); String filterAsRegex = filter.replaceAll("\\[", "[\\\\Q").replaceAll(

我正在对android的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中有没有更简单的方法来实现这一点?

如果你不反对使用一个好的老Apache项目,你可以随时将它包含在你的应用程序中(它像往常一样是Apache许可的)。不幸的是,现在的2.0.x版本很稳定,在安卓系统上运行良好,没有任何额外的积垢

    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
    }
GlobCompiler gc=new GlobCompiler();
试一试{
Perl5Pattern=(Perl5Pattern)gc.compile(“[JKL][DEF][DEF]”);
Perl5Matcher matcher=新的Perl5Matcher();
字符串straw=“JEEVES”;
if(matcher.matchesPrefix(吸管、图案)){
MatchResult res=matcher.getMatch();
对于(int i=0;i
这里可以看到上下文中的代码:您不能使用Pattern.quote()吗;要将UTF8字符、重音符号和其他标点符号转义为正则表达式可匹配字符串?@LastCoder:遗憾的是,它不会引用作为全局字符类说明符一部分的[]。我怀疑我将不得不重构代码,以便在例程之间更容易地共享类。与Java内置的正则表达式处理相比,使用ORO(除了额外的依赖项)给我带来了什么好处?我想我应该能够让java.util.regex的东西正常工作。ORO页面上的评论是“鼓励ORO用户在新的java版本中使用类似的功能,如果有的话。”这似乎意味着纯java的一切都是可能的。不过,我将尝试一下,看看它在扩展UTF-8比赛中表现如何。