Подтвердить что ты не робот

Найти всю строку "the" в .txt файле

Вот мой код:

// Import io so we can use file objects
import java.io.*;

public class SearchThe {
    public static void main(String args[]) {
        try {
            String stringSearch = "the";
            // Open the file c:\test.txt as a buffered reader
            BufferedReader bf = new BufferedReader(new FileReader("test.txt"));

            // Start a line count and declare a string to hold our current line.
            int linecount = 0;
                String line;

            // Let the user know what we are searching for
            System.out.println("Searching for " + stringSearch + " in file...");

            // Loop through each line, stashing the line into our line variable.
            while (( line = bf.readLine()) != null){
                // Increment the count and find the index of the word
                linecount++;
                int indexfound = line.indexOf(stringSearch);

                // If greater than -1, means we found the word
                if (indexfound > -1) {
                    System.out.println("Word was found at position " + indexfound + " on line " + linecount);
                }
            }

            // Close the file after done searching
            bf.close();
        }
        catch (IOException e) {
            System.out.println("IO Error Occurred: " + e.toString());
        }
    }
}

Я хочу найти слово " в файле test.txt. Проблема в том, что когда я нашел первый " , моя программа перестает находить больше.

И когда какое-то слово вроде ", тогда" моя программа понимает это как слово ".

4b9b3361

Ответ 1

Не используйте регистр Regexes с границами слов, чтобы найти все экземпляры и варианты ".".

indexOf("the") не может различаться между " и ", а затем, поскольку каждый начинается с "the" . Аналогично, "the" находится в середине "анафемы" .

Чтобы избежать этого, используйте регулярные выражения и найдите "the" со границами слов (\b) с обеих сторон. Используйте границы слов вместо разделения на "" или используя только indexOf(" the ") (пробелы с каждой стороны), которые не найдут "." и другие экземпляры рядом с пунктуацией. Вы также можете сделать свой поиск случайным образом, чтобы найти "The".

Pattern p = Pattern.compile("\\bthe\\b", Pattern.CASE_INSENSITIVE);

while ( (line = bf.readLine()) != null) {
    linecount++;

    Matcher m = p.matcher(line);

    // indicate all matches on the line
    while (m.find()) {
        System.out.println("Word was found at position " + 
                       m.start() + " on line " + linecount);
    }
}

Ответ 2

Вы не должны использовать indexOf, потому что он найдет всю возможную подстроку, которая у вас есть в вашей строке. И поскольку "then" содержит строку "the", поэтому она также является хорошей подстрокой.

Подробнее о indexOf

IndexOf

public int indexOf (String str,                    int fromIndex) Возвращает индекс внутри этой строки первого появления указанная подстрока, начиная с указанный индекс. Возвращаемое целое число - наименьшее значение k, для которого:

Вы должны разделить строки на многие слова и перебрать их по каждому слову и сравнить с "the".

String [] words = line.split(" ");
for (String word : words) {
  if (word.equals("the")) {
    System.out.println("Found the word");
  }
}

Вышеприведенный фрагмент кода также будет охватывать все возможные "строки" в строке для вас. Использование indexOf всегда возвращает вам первое вхождение

Ответ 3

Ваша текущая реализация найдет только первый экземпляр '' для каждой строки.

Рассмотрим разбиение каждой строки на слова, итерацию по списку слов и сравнение каждого слова с "the":

while (( line = bf.readLine()) != null)
{
    linecount++;
    String[] words = line.split(" ");

    for (String word : words)
    {
        if(word.equals(stringSearch))
            System.out.println("Word was found at position " + indexfound + " on line " + linecount);
    }
}

Ответ 4

Не похоже, что точка упражнения - это навык, который вы используете в регулярных выражениях (я не знаю, что это может быть... но для вас это немного мало), хотя регулярные выражения действительно будут реальное решение таких вещей.

Мой совет - сосредоточиться на основах, использовать индекс и подстроку для проверки строки. Подумайте, как вы могли бы объяснить естественный характер струн. Кроме того, ваш читатель всегда закрывается (т.е. Существует способ, которым bf.close() не будет выполняться)?

Ответ 5

Лучше всего использовать Регулярные выражения для такого поиска. В качестве простого/грязного обходного пути вы можете изменить свой stringSearch с

String stringSearch = "the";

к

String stringSearch = " the ";