Устранение неполадок Java заменяет все - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь написать метод, который принимает входную строку, которая будет найдена, и входную строку, чтобы заменить все вхождения найденного слова и вернуть количество сделанных замен.Я пытаюсь использовать шаблон и совпадения из регулярных выражений JAVA.У меня есть текстовый файл с именем «text.txt», который включает «это тест, это тест, это тест».Когда я пытаюсь найти слово «test» и заменить его на «mess», метод каждый раз возвращает 1, и ни одно из слов test не заменяется.

public int findAndRepV2(String word, String replace) throws FileNotFoundException, IOException 
{
    int cnt = 0; 

    BufferedReader input = new BufferedReader( new FileReader(this.filename));
    Writer fw = new FileWriter("test.txt");
    String line = input.readLine();


    while (line != null)
    {
        Pattern pattern = Pattern.compile(word, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(line);
        while (matcher.find()) {matcher.replaceAll(replace); cnt++;}

        line = input.readLine();
    }
    fw.close();
    return cnt;
}

1 Ответ

0 голосов
/ 26 ноября 2018

Во-первых, вы должны убедиться, что текст, который вы ищете, не интерпретируется как регулярное выражение.Вы должны сделать:

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++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...