Eu recomendo que você abandone completamente o regex - é simplesmente um grande problema fazê-lo funcionar em casos como este. Nem tudo pode ser resolvido facilmente com regex! Nesse caso, a maioria das linguagens de script pode fazer isso com bastante facilidade. Eu escrevi um pedaço de JavaScript para você, aqui - basta digitar seus delimitadores e entrada e clicar em enviar.
Quanto a uma explicação: ele é dividido pelo delimitador inicial e, em seguida, para cada 'bloco', ele é dividido pelo delimitador final. Acabamos com um bloco de texto entre o início e o fim e fazemos um substituto para isso. Então nós juntamos os blocos de divisão juntos. Essa não é a maneira mais eficiente, mas é um pouco mais fácil do que processar caracteres individuais.
A solução antiga, parcialmente funcional, de regex está abaixo. Eu recomendo que você não o use.
Resposta rápida: não use o Notepad ++, use este snippet JS (insira seu texto no canto inferior direito e clique em enviar). Substitua START
e END
no script no canto inferior esquerdo, conforme necessário.
Como alternativa, você pode usar o PowerShell, que é nativo do Windows (Vista +):
Get-Content input.txt | %{ $_ -replace "(?<=START.*?)-(?=.*?END)", " " } | Out-File output.txt
Substitua input.txt
e output.txt
de acordo. Nota: eles devem ser arquivos diferentes.
Esta solução específica só funciona sem bugs se você tiver apenas uma ocorrência de START
por linha e uma ocorrência de END
por linha e eles não abrangem as linhas - para que possamos lidar com cada linha independentemente.
Dadas as garantias de que apenas uma correspondência será necessária por linha, e cada correspondência está contida em uma linha, corresponder para (?<=START.*?)-(?=.*?END)
e substituir por um único espaço funcionaria - exceto Notepad ++ doesn ' Parece que eu gosto desse padrão em particular. Ele suporta lookbehinds e lookaheads (PCRE completo, aparentemente), mas há algo sobre isso que o atrapalha.
Uma alternativa, semelhante à que Johannes já respondeu, é usar um padrão simples: (START.*?)-(.*?END)
e substituí-lo por
. O problema aqui é que isso corresponderá a apenas um hífen por linha por vez. Isso rapidamente se torna tedioso.
Aqui, tentamos usar uma linguagem de script mais completa. JavaScript é uma boa alternativa. No entanto, não suporta lookbehinds. No lado positivo, podemos executar as coisas em um loop, então a solução tediosa anterior é realmente viável. Eu criei um exemplo aqui .