Java фильтрует слова из файла, даже если встречаются редкие пробелы

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

Конечно, я читаю файл и фильтрую то, что мне не нужно, с помощью replaceAll("[^a-zA-Z0-9]", "");

Но это приносит проблему. Потому что я фильтрую по пробелам, и есть некоторые особые случаи, такие как:

wobbewy!'--'Wobbewy,'

Я получаю такие слова:

wobbewywobbewy

Можно ли как-то фильтровать слова в пробелах, а также отфильтровывать эти особые случаи, не создавая огромного количества операторов if?

Пример кода того, что происходит после того, как я попробовал исправить:

while ((thisLine = bufferedReader.readLine()) != null) {
        String[] woord = thisLine.toString().trim().split("\\s+");
        for(int i=0; i<woord.length; i++){
            normalWord = woord[i].replaceAll("[^a-zA-Z]+", " ");
            normalWord = normalWord.toLowerCase();

Затем я получаю вывод, например:

xxv ​​(несколько пробелов) мой


person Tvt    schedule 03.04.2016    source источник
comment
Почему бы вам не использовать ([^a-zA-Z0-9], ), тогда !'--' будет заменено пробелом, и будет работать разделение пробелом. В качестве альтернативы: ничего не заменяйте и ищите слова, используя регулярное выражение, например, используя шаблон \w+.   -  person kevcodez    schedule 03.04.2016
comment
Конечно, вся эта проблема усугубляется при работе с языками, в которых не используются пробелы для разделения слов. В некоторых языках (тайский, IIRC?) простое разбиение блока текста на слова требует словаря и алгоритма рекурсивного возврата.   -  person Daniel Pryden    schedule 04.04.2016


Ответы (2)


Разделение потребляет ввод, поэтому разделяйте символы «не слова»:

String[] woord = thisLine.trim().split("[^a-zA-Z0-9']+");

Обратите внимание, что я добавил апостроф к символам, чтобы сохранить их, что позволит рассматривать такие слова, как «нельзя», как одно слово.

person Bohemian♦    schedule 03.04.2016

При удалении специальных символов ваша информация о границах слов теряется.

Измените replaceAll("[^a-zA-Z0-9]", ""); на replaceAll("([^a-zA-Z0-9]|\s)+", " "); (замените специальные символы и пробелы одним пробелом).

person slartidan    schedule 03.04.2016
comment
Это создаст пять пробелов для примера OP. Я бы предпочел "[^a-zA-Z0-9]+", а затем разделить по пробелу. - person nyname00; 03.04.2016
comment
Этот пример не работает и выдает ошибку =) Возможно, это я, но как это будет работать в следующем сценарии?: while ((thisLine = bufferedReader.readLine()) != null) { String[] woord = thisLine.toString ().trim().replaceAll(([^a-zA-Z0-9]|\\s)+, ); for(int i=0; i‹word.length; i++){ normalWord = woord[i] normalWord = normalWord.toLowerCase(); - person Tvt; 03.04.2016