.+?([!?.](?= |$)|$)
должно работать.
Оно будет соответствовать любой последовательности символов, которые
- , сопровождаются знаком пунктуации, за которым следует пробел или конец-string или
- с последующим концом строки.
Используя квантификатор с неохотой +?
, он находит кратчайшие возможные последовательности (= отдельные предложения).
В JavaScript:
result = subject.match(/.+?([!?.](?= |$)|$)/g);
РЕДАКТИРОВАНИЕ:
Чтобы избежать разбиения регулярного выражения на "пробел / одиночная буква или многозначное число / точка", вы можете использовать:
result = subject.match(/( \d+\.| [^\W\d_]\.|.)+?([!?.](?= |$)|$)/g);
Это расколется
Я покинул Соединенные Штаты со слезами на глазах!23. Я знал, что буду очень скучать по своим американским друзьям.I. Всего наилучшего вам.
в
I left the United States with my eyes full of tears!
23. I knew I would miss my American friends very much.
I. All the best to you.
Вместо того, чтобы просто сопоставить какой-либо символ, пока он не найдет точку, нужно:
- Сначала попробуйте сопоставить пробел, число и точку.
- Если это не удастся, попробуйте сопоставить пробел, букву и точку.
- Если это не удалось,соответствует любому символу.
Таким образом, точка после числа / буквы уже сопоставлена и не будет сопоставляться с символом пунктуации, следующим за следующим в регулярном выражении.