2014-11-02 7 views
0

Я начинающий программист в Java и регулярных выражениях, и я хотел создать простую программу wordcount.Как сокращенный синтаксис Regex отличается от длинной версии?

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

Учитывая, что line является строка считывается из другого файла, который будет wordcounted, word является Pattern для разделения слов, и wordList является List<String>, который содержит все слова, то как следующий код:

Matcher match = word.matcher(line); 
while(match.find()) 
    wordList.add(match.group()); 

... отличается от этого кода?

while((Matcher match = word.matcher(line)).find()) 
    wordList.add(match.group()); 

Спасибо за любую помощь.

(Кроме того, вы можете мне помочь с названием? Я не знаю, что называть «стенограмму» код.)

ответ

3

В коде как

while(condition){ 
    body 
} 

перед каждой итерации кода из condition выполняется, чтобы проверить, должен ли быть выполнен блок {body}. В случае второго примера

while((Matcher match = word.matcher(line)).find()) 
    wordList.add(match.group()); 

перед каждой итерации вы выполняете

(Matcher match = word.matcher(line)).find() 

, который создает новый экземпляр Matcher. Важно то, что эти новые экземпляры всегда устанавливаются в определенное состояние по умолчанию. В случае класса Matcher это состояние содержит информацию о том, что он должен начинать с начала начала переданной строки (в вашем случае line), поэтому каждый из этих новых созданных совпадений может найти только первое совпадение.

В первом примере

Matcher match = word.matcher(line); 
while(match.find()) 
    wordList.add(match.group()); 

эта проблема не существует, потому что вы используете только один экземпляр из Matcher, который после каждого find запоминает позицию последнего найденного элемента и будет искать следующий после эта позиция.

+0

полностью имеет смысл. Спасибо! Я буду помнить об этом. –

+0

@Jon Добро пожаловать :) – Pshemo

+0

вид не по теме, но есть ли имя для объединения деклараций 'Matcher' и операторов while? While? это ново для меня, и я думаю, что это круто, но я не знаю, как это назвать. –