在Java中使用Regex实现简单的字符串匹配

时间:2015-07-08 20:49:11

标签: java regex string

我正在尝试使用Java中的通配符实现简单的正则表达式字符串匹配。所以我的想法是,你有一个针(要搜索的字符串)和一个干草堆(被搜索的字符串),你必须在大海捞针中搜索针并给出针的起始索引。通配符出现的情况是,作为针提供的字符串不完整,缺少的字符被替换为下划线' _'(例如test等同于t_st或tes_t或te__ )。 我写了一个简单的方法,将大海捞针和针作为参数,但我不能让它起作用。我一直收到IIllegalStateException:没有匹配可用错误。这是代码:

     static int findRegex(String needle, String haystack)
{
    char [] needleChars = needle.toCharArray();
    StringBuilder builder = new StringBuilder("");

    builder.append(".*");
    for (char c: needleChars)
    {
        builder.append('(');
        builder.append(c);
        builder.append('|');            
        builder.append('_');
        builder.append(')');
    }

    System.out.println(builder.toString());

    return Pattern.compile(builder.toString()).matcher(haystack).start();
}

我已经测试了代码(.*(t|_)(e|_)(s|_)(t|_))生成的正则表达式模式,但它确实有效。我哪里出错了?

1 个答案:

答案 0 :(得分:4)

IIllegalStateException: No match available error表示,正则表达式引擎无法找到正则表达式的任何匹配项。

时可以抛出
  • 您没有从Matcher调用其中一种方法让其搜索匹配项:

    • matches()
    • find()
    • lookingAt()
  • 这些方法的结果将是false,这意味着尽管尝试了,但正则表达式引擎无法找到任何匹配项。在这种情况下,没有有效的索引可以作为start()返回。

无论如何,我怀疑你的方法应该更像

static int findRegex(String needle, String haystack) {

    String regex = needle.replace("_", ".{0,10}?");
    //System.out.println(regex);

    Matcher matcher = Pattern.compile(regex).matcher(haystack);
    if (matcher.find()){
        return matcher.start();
    }else{
        return -1;
    }
}

我只是将_.{0,10}?替换为任意字符(限制为10个字符)。我还添加了?以使此量词不情愿,因此te_t会找到最小匹配。