<p class="mb-40px">Decisive too, of
<p class="mb-40px">otherwise, it was the opportunity to
<p class="mb-40px">acquire what were to be two pillars
<p class="mb-40px">fundamentals of his intellectual formation:
<p class="mb-40px">Latin and virtually none of the Greek
<p class="mb-40px">written down, they were the subject of daily commentary on Apollo.</p>
Deve se tornar:
<p class="mb-40px">Decisive too, of otherwise, it was the opportunity to acquire what were to be two pillars fundamentals of his intellectual formation: Latin and virtually none of the Greek written down, they were the subject of daily commentary on Apollo.</p>
Meu regex não é muito bom:
Encontrar: (<p class="mb-40px">)(.*?\s+\n)[\s\S]*?</p>
Substituir por: \1$0\3
Você pode simplesmente pesquisar (com Regex) por:
E substitua por (observe o espaço depois
\1
e um espaço.Isso encontrará todas
<p class="mb-40px">
as tags (que não vêm depois de outra tag, portanto, não a primeira).([^>])\s+(<p class="mb-40px">)
\1\x20
. matches newline
Regex não pode concatenar um número variável de linhas, isso é mais adequado para uma linguagem de programação do que regex.
Minha solução requer a concatenação de duas linhas por vez, portanto, você precisará "Substituir tudo" quantas vezes forem necessárias até que a substituição falhe.
Esta é a string de pesquisa complicada:
Localizar:
^<p class="mb-40px">(.*(?<!p>))\R^<p class="mb-40px">(.*?(?<!p>))$
Substituir por:
<p class="mb-40px">\1 \2
Modo de pesquisa: Expressão regular sem ". corresponde à nova linha".
Para entender como isso funciona, veja a divisão dos termos em regex101 .
Referência: Regex para string que não termina com o sufixo fornecido .