Начиная с Java 9, я бы использовал
// preparation, these can be static final variables
Pattern sentence = Pattern.compile("[^.?!]+"), word = Pattern.compile("\\w+");
и
int maxWordsPerSentence = sentence.matcher(string).results()
.mapToInt(s -> (int)word.matcher(s.group()).results().count())
.max().orElse(0);
Поток по намеченным совпадениям прост, так как теперь нам не нужно фильтроватьпустые строки, так как поток без совпадений будет правильно сообщать нулевой счет.
Вы можете использовать аналогичную логику в Java 8, используя реализацию results()
в этот ответ .Вам нужно всего лишь изменить код на
int maxWordsPerSentence = results(sentence.matcher(string))
.mapToInt(s -> (int)results(word.matcher(s.group())).count())
.max().orElse(0);
, чтобы вместо этого вызывать метод static
.