有一个String操作的任务。 matcher.find()抛出outOfBoundExc,matcher.find(0)工作得很好......为什么会这样?

时间:2014-01-04 01:00:55

标签: java string matcher

任务是从句子中删除字母i。

public static void main(String[] args) {

    int index = 8;
    String letter = "i";
    String text = "method appends the string to the end. t is overloaded to have the following forms.";
    StringBuffer sb = new StringBuffer(text);
    Pattern pat = Pattern.compile(letter);
    Matcher mat = pat.matcher(sb);

   //while (mat.find()) -throws StringIndexOutOfBoundsException. 
    while (mat.find(0)){
        sb.deleteCharAt(mat.start());
    }

    System.out.println(sb.toString());
}

嗯,程序有效,但我不明白为什么显而易见的方法不起作用?

1 个答案:

答案 0 :(得分:0)

您必须使用mat.reset()方法,因为当您删除char时,匹配器知道的字符串长度变为无效,您将不得不重置匹配器。

发生的情况如下:您创建匹配器并将原始长度为5的字符串传递给它,现在在调用find之后,您正在从缓冲区中删除一个字符,这会使匹配器的状态无效为新长度为4.因此需要重置。

  

为什么find(0)有效?

答案就在于源头,

JDK 1.6中的方法,

public boolean find(int start) {
        int limit = getTextLength();
        if ((start < 0) || (start > limit))
            throw new IndexOutOfBoundsException("Illegal start index");

        reset(); //reset is called here
        return search(start);
}