Если текст может охватывать абзацы (несмотря на ссылку на «предложение» в вопросе), вы можете использовать регулярное выражение
*\n *(?!\n*[A-Z])
(с пробелом, предшествующим первому *
).
Совпадения заменяются одним пробелом.
Демонстрация
Выполняет следующие операции:
* * match 0+ spaces
\n * match a newline char
* * match 0+ spaces
(?!\n*[A-Z]) * match 0+ newlines followed by an uc letter
* in a negative lookahead
Как показано на ссылка, текст
Now is the time for all good regexers
to social distance themselves.
Here's to negative lookbehinds!
And also to positive lookbehinds!
становится
Now is the time for all good regexers to social distance themselves.
Here's to negative lookbehinds!
And also to positive lookbehinds!
, даже несмотря на то, что после символа новой строки, следующего за negative lookbehinds!
, непосредственно не следует заглавная буква, а другая новая строка, за которой следует заглавная case case.
Если строка заканчивается новой строкой, она будет удалена. Это потому, что я использую негативный взгляд, а не позитивный.