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

2

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. Por favor, veja o exemplo abaixo, eu 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.

Eu tenho tentado resolver isso usando exemplos de expressões regulares Eu 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
    
por Piotr Berebecki 07.12.2013 / 10:09

2 respostas

5

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 .

    
por 07.12.2013 / 15:00
2

Um regexp adequado seria (START[^\-]*)-(.*END) , substitua por e use "Replace All" MULTIPLE TIMES (só substituirá um - em cada linha por clique).

    
por 07.12.2013 / 14:38