Как я могу отфильтровать не буквы из текстового файла, используя разделитель сканера, включая одинарные кавычки или апостроф в Java - PullRequest
2 голосов
/ 09 ноября 2010

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

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(("[.,:;()?!\" \t\n\r]+")).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(("[.,:;()?!\" \t\n\r]+")).next();
    }

Кажется, это не работает!

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

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

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

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 для соответствия всем символам пробела.

Больше информации на Шаблон документации

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

Редактировать

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

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 , использует регулярное выражение для сопоставления, поэтому оно должно совпадать с любым из этих символов и по существу удалять его.

1 голос
/ 09 ноября 2010

Разделитель не является регулярным выражением, поэтому в вашем примере он ищет вещи, разделенные на "[.,:; ()?! \" \ 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) );
    }

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

0 голосов
/ 15 декабря 2015

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

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

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

...