我正在尝试使用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|_)
)生成的正则表达式模式,但它确实有效。我哪里出错了?
答案 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
会找到最小匹配。