Найти всю строку "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. Проблема в том, что когда я нашел первый " , моя программа перестает находить больше.
И когда какое-то слово вроде ", тогда" моя программа понимает это как слово ".
Ответы
Ответ 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 ";