Como substituir um caractere específico entre palavras específicas?

Como substituir um caractere específico entre palavras específicas?

Você poderia me ajudar a descobrir como posso usar a função Localizar/Substituir do Notepad++ para substituir um caractere específico entre palavras específicas. Veja o exemplo abaixo, gostaria de encontrar todos os hífens entre as palavras 'START' e 'END' e substituí-los por espaços. Todos os outros hífens no documento não seriam substituídos.

Tenho tentado resolver isso usando exemplos de expressões regulares que pesquisei no Google mas infelizmente não tive sucesso até agora.

Aqui está o que eu tenho:

START-Hyphens-should-be-replaced-here-01-END
OTHER-no-changes-here-02-WORD
START-Hyphens-should-also-be-replaced-here-03-END
OTHER-no-changes-here-either-04-TEXT

Aqui está o que eu gostaria de ter:

START Hyphens should be replaced here 01 END
OTHER-no-changes-here-02-WORD
START Hyphens should also be replaced here 03 END
OTHER-no-changes-here-either-04-TEXT

Responder1

Eu recomendaria que você abandonasse totalmente o regex - é simplesmente muito trabalhoso 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 inserir seus delimitadores e inserir e clicar em enviar.

Quanto à explicação: ele é dividido pelo delimitador inicial e, para cada 'bloco', é dividido pelo delimitador final. Acabamos com um bloco de texto que está entre o início e o fim e realizamos uma substituição nele. Em seguida, juntamos os blocos divididos novamente. Essa não é a maneira mais eficiente, mas é um pouco mais fácil do que processar caracteres individuais.

xkcd - Problemas Perl


A solução regex antiga e parcialmente funcional está abaixo. EUfortementerecomendo que você não o use.

Resposta rápida: não use o Notepad++, useesseSnippet JS (insira seu texto no canto inferior direito e clique em enviar). Substitua STARTe ENDno script no canto inferior esquerdo conforme necessário.

Alternativamente, você pode usar o PowerShell, que é nativo do Windows (Vista+):

Get-Content input.txt | %{ $_ -replace "(?<=START.*?)-(?=.*?END)", " " } | Out-File output.txt

Substitua input.txte output.txtconsequentemente. Nota: devem ser arquivos diferentes.

Esta solução específica só funciona sem bugs se você tiver apenasumocorrência de STARTpor linhae umocorrência de ENDpor linhaeeles não abrangem linhas - portanto, podemos lidar com cada linha de forma independente.


Dadas as garantias de que apenas uma correspondência será necessária por linha, e cada correspondência está contida em uma linha, combinar (?<=START.*?)-(?=.*?END)e substituir por um único espaço funcionaria -excetoO Notepad++ não parece gostar desse padrão específico. Ele suporta lookbehinds e lookaheads (PCRE completo, aparentemente), mas há algo nisso que atrapalha.

Uma alternativa, semelhante ao que Johannes já respondeu, é usar um padrão simples: (START.*?)-(.*?END)e substituí-lo por \1 \2. O problema aqui é que isso só corresponderáumhífen por linha de cada vez. Isso rapidamente se torna tedioso.

Aqui, tentamos usar uma linguagem de script mais completa. JavaScript é uma boa alternativa. no entantonãosuporte olhar para trás. Do lado positivo, podemos executar as coisas em loop, de modo que a tediosa solução anterior é realmente viável. Eu criei um exemploaqui.

Responder2

Um regexp adequado seria (START[^\-]*)-(.*END), substitua-o por \1 \2e use "Substituir tudo" MÚLTIPLAS VEZES (substituirá apenas um - em cada linha por clique).

informação relacionada