Во-первых, вы должны убедиться, что текст, который вы ищете, не интерпретируется как регулярное выражение.Вы должны сделать:
Pattern pattern = Pattern.compile(Pattern.quote(word), Pattern.CASE_INSENSITIVE);
Во-вторых, replaceAll
делает что-то вроде этого:
public String replaceAll(String replacement) {
reset();
boolean result = find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
appendReplacement(sb, replacement);
result = find();
} while (result);
appendTail(sb);
return sb.toString();
}
return text.toString();
}
Обратите внимание, как он вызывает find
, пока не может ничего найти.Это означает, что ваш цикл будет запущен только один раз, поскольку после первого вызова replaceAll
средство сопоставления уже нашло все.
Вместо него следует использовать appendReplacement
:
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, replace);
cnt++;
}
buffer.append(line.substring(matcher.end()));
// "buffer" contains the string after the replacement
Я заметил, что в вашем методе вы ничего не сделали со строкой после замены.Если это так, просто посчитайте, сколько раз find
вернет истину:
while (matcher.find()) {
cnt++;
}