Хотел убить минуту или две (или 25;)), поэтому я придумал это (совсем не надежное) решение:
(?i).*?\b((?=[a-z']*[aoueiy])(?=[a-z']*[^aoueiy])\w{2,}\.)
Что он делает, это идентифицирует слово, за которым следует полная остановка. Чтобы отделить это слово от любых сокращений, он ищет последовательность символов ({2,}
= более 1), которая содержит хотя бы одну гласную и одну согласную. Это достигается с помощью двух «смотреть головы» до сопоставления слова.
Посмотрите голову, чтобы найти гласный в слове: (?=[a-z]*[aoueiy])
[a-z]*
= любое количество букв сопровождаемый классом символов [aoueiy]
- гласная.
Согласный тот же, только с отрицанным символьным классом [^aoueiy]
, соответствующим любому согласному (а также любому другому, не являющемуся букве, но так как совпадение - буквы только это не имеет значения;)
Обратите внимание, что это, конечно, совсем не похоже на полный синтаксический анализатор языка, но он может работать во многих случаях. Одна вещь, которую это пропустило бы, - предложения заканчиваются однобуквенным словом «я». Как "Мы хорошо вместе, вы и я".
Смотрите здесь на regex101