任务是从句子中删除字母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());
}
嗯,程序有效,但我不明白为什么显而易见的方法不起作用?
答案 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);
}