Как я могу отфильтровать не буквы из текстового файла с помощью разделителя сканера, включая одинарную кавычку или Апостроф в Java


Пожалуйста, я хочу вести подсчет каждого слова из файла, и этот подсчет не должен включать не буквы, такие как Апостроф, запятая, точка, вопросительный знак, восклицательный знак, т. е. т. е. просто буквы алфавита. Я попытался использовать такой разделитель, но он не включал Апостроф.

Scanner fileScanner = new Scanner("C:\MyJavaFolder\JavaAssignment1\TestFile.txt");
    int totalWordCount = 0;

    //Firstly to count all the words in the file without the restricted characters 
    while (fileScanner.hasNext()) {
        fileScanner.useDelimiter(("[.,:;()?!" tnr]+")).next();
        totalWordCount++;
    }
    System.out.println("There are " + totalWordCount + " word(s)");

  //Then later I create an array to store each individual word in the file for counting their lengths.
    Scanner fileScanner2 = new Scanner("C:\MyJavaFolder\JavaAssignment1\TestFile.txt");
    String[] words = new String[totalWordCount];
    for (int i = 0; i < totalWordCount; ++i) {
        words[i] = fileScanner2.useDelimiter(("[.,:;()?!" tnr]+")).next();
    }

Это, кажется, не работает !

Пожалуйста, как я могу это сделать ?

3 2

3 ответа:

Мне кажется, что вы не хотите фильтровать, используя что-либо, кроме пробелов и конечных строк. Например, слово " они "будет возвращено в виде двух слов, если вы используете' для фильтрации количества слов. Вот как вы можете изменить исходный код, чтобы заставить его работать.

Scanner fileScanner = new Scanner(new File("C:\\MyJavaFolder\\JavaAssignment1\\TestFile.txt"));
    int totalWordCount = 0;
    ArrayList<String> words = new ArrayList<String>();

    //Firstly to count all the words in the file without the restricted characters 
    while (fileScanner.hasNext()) {
        //Add words to an array list so you only have to go through the scanner once
        words.add(fileScanner.next());//This defaults to whitespace
        totalWordCount++;
    }
    System.out.println("There are " + totalWordCount + " word(s)");
    fileScanner.close();

Использование Pattern.compile() превращает вашу строку в регулярное выражение. Символ '\s ' предопределен в классе Pattern, чтобы соответствовать всем символам пробела.

Есть более подробная информация по адресу шаблон Документация

Кроме того, не забудьте закрыть классы сканеров, когда закончите. Это может помешать открытию второго сканера.

Edit

Если вы хотите подсчитать Буквы в слове, вы можете добавить следующий код к вышеуказанному коду

int totalLetters = 0;
int[] lettersPerWord = new int[words.size()];
for (int wordNum = 0; wordNum < words.size(); wordNum++)
{
 String word = words.get(wordNum);
 word = word.replaceAll("[.,:;()?!\" \t\n\r\']+", "");
 lettersPerWord[wordNum] = word.length();
 totalLetters = word.length();
}

Я протестировал этот код, и он, похоже, работает для меня. replaceAll, согласно JavaDoc использует регулярное выражение для сопоставления, поэтому оно должно соответствовать любому из этих символов и по существу, удалить его.

Разделитель не является регулярным выражением, поэтому в вашем примере он ищет вещи, разделенные между" [.,:;()?!\ "\t\n\r]+ "

Вы можете использовать регулярное выражение вместо разделителя

Использование класса regexp с методом group может быть тем, что вы ищете.

String pattern = "(.*)[.,:;()?!\" \t\n\r]+(.*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(test);
    if (m.find( )) {
        System.out.println("Found value: " + m.group(1) );
    }

Поиграйте с этими классами, и вы увидите, что это гораздо больше похоже на то, что вам нужно

Вы можете попробовать это регулярное выражение в вашем разделителе: fileScanner.useDelimiter(("[^a-zA-Z]|[^\']")).next();

В качестве разделителя будет использоваться любой не буквенный символ или не Апостроф. Таким образом, ваши слова будут включать апостроф, но не любой другой не буквенный символ.

Затем вам придется перебирать каждое слово и проверять апострофы и учитывать их, если вы хотите, чтобы длина была точной. Вы можете просто удалить каждый апостроф, и длина будет соответствовать количеству букв в слове, или вы можете создать слово объекты с их собственными полями длины, так что вы можете напечатать слово как есть, и знать количество букв символов в этом слове.