¿Cómo reemplazar un carácter específico entre palabras específicas?

¿Cómo reemplazar un carácter específico entre palabras específicas?

¿Podría ayudarme a descubrir cómo puedo usar la función Buscar/Reemplazar de Notepad++ para reemplazar un carácter específico entre palabras específicas? Consulte el ejemplo a continuación. Me gustaría encontrar todos los guiones entre las palabras 'INICIO' y 'FIN' y reemplazarlos con espacios. Todos los demás guiones del documento no se reemplazarán.

He estado intentando resolver esto usando ejemplos de expresiones regulares que busqué en Google, pero desafortunadamente no he tenido éxito hasta ahora.

Esto es lo que tengo:

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

Esto es lo que me gustaría tener:

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

Respuesta1

Le recomendaría que abandone las expresiones regulares por completo; simplemente es demasiado complicado lograr que funcione en casos como este. ¡No todo se puede resolver fácilmente con expresiones regulares! En este caso, la mayoría de los lenguajes de programación pueden hacerlo con bastante facilidad. He escrito un fragmento de JavaScript para ti.aquí- simplemente ingrese sus delimitadores y entradas, y haga clic en enviar.

En cuanto a una explicación: se divide por el delimitador inicial, luego, para cada 'bloque', se divide por el delimitador final. Terminamos con un bloque de texto que se encuentra entre el inicio y el final, y realizamos un reemplazo sobre eso. Luego volvemos a unir los bloques divididos. Esa no es la forma más eficiente, pero es un poco más fácil que procesar caracteres individuales.

xkcd - Problemas de Perl


A continuación se encuentra una antigua solución de expresiones regulares que funciona parcialmente. IfuertementeTe recomendamos que no lo uses.

Respuesta rápida: no uses Notepad++, usaesteFragmento JS (ingrese su texto en la parte inferior derecha y haga clic en enviar). Reemplace STARTy ENDen el script en la parte inferior izquierda según sea necesario.

Alternativamente, puede usar PowerShell, que es nativo de Windows (Vista+):

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

Reemplace input.txty output.txten consecuencia. Nota: deben ser archivos diferentes.

Esta solución particular sólo funciona sin errores si sólo tienesunoaparición de STARTpor líneay unoaparición de ENDpor líneayno abarcan líneas, por lo que podemos tratar cada línea de forma independiente.


Dadas las garantías de que solo se necesitará una coincidencia por línea, y cada coincidencia está contenida dentro de una línea, hacer coincidir (?<=START.*?)-(?=.*?END)y reemplazar con un solo espacio funcionaría:exceptoA Notepad++ no parece gustarle este patrón en particular. Admite búsquedas hacia atrás y hacia adelante (PCRE completo, aparentemente), pero hay algo en esto que lo hace tropezar.

Una alternativa, similar a lo que Johannes ya respondió, es usar un patrón simple: (START.*?)-(.*?END)y reemplazarlo con \1 \2. El problema aquí es que esto sólo coincidiráunoguión por línea a la vez. Esto rápidamente se vuelve tedioso.

Aquí intentamos utilizar un lenguaje de secuencias de comandos más completo. JavaScript es una buena alternativa. De todos modos, esonosoporte retrospectivo. En el lado positivo, podemos ejecutar las cosas en un bucle, por lo que la tediosa solución anterior es realmente viable. He creado un ejemploaquí.

Respuesta2

Una expresión regular adecuada sería (START[^\-]*)-(.*END)reemplazarla con \1 \2y usar "Reemplazar todo" MÚLTIPLES VECES (solo reemplazará una, en cada línea por clic).

información relacionada