Wie ersetzt man ein bestimmtes Zeichen zwischen bestimmten Wörtern?

Wie ersetzt man ein bestimmtes Zeichen zwischen bestimmten Wörtern?

Können Sie mir helfen, herauszufinden, wie ich mit der Suchen/Ersetzen-Funktion von Notepad++ ein bestimmtes Zeichen zwischen bestimmten Wörtern ersetzen kann? Sehen Sie sich bitte das folgende Beispiel an. Ich möchte alle Bindestriche zwischen den Wörtern „START“ und „END“ finden und durch Leerzeichen ersetzen. Alle anderen Bindestriche im Dokument würden nicht ersetzt.

Ich habe versucht, dies mithilfe von Beispielen für reguläre Ausdrücke zu lösen, die ich gegoogelt habe, aber bisher war ich leider ohne Erfolg.

Hier ist, was ich habe:

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

Folgendes hätte ich gerne:

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

Antwort1

Ich würde Ihnen empfehlen, ganz auf Regex zu verzichten – es ist einfach zu mühsam, es in solchen Fällen zum Laufen zu bringen. Nicht alles lässt sich einfach mit Regex lösen! In diesem Fall können die meisten Skriptsprachen dies ziemlich einfach tun. Ich habe ein Stück JavaScript für Sie geschrieben,Hier- Geben Sie einfach Ihre Trennzeichen und Eingaben ein und klicken Sie auf „Senden“.

Zur Erklärung: Es wird nach dem Starttrennzeichen geteilt, dann wird für jeden „Block“ nach dem Endtrennzeichen geteilt. Wir erhalten am Ende einen Textblock, der zwischen Anfang und Ende liegt, und führen eine Ersetzung dafür durch. Dann fügen wir die geteilten Blöcke wieder zusammen. Das ist nicht die effizienteste Methode, aber etwas einfacher als die Verarbeitung einzelner Zeichen.

xkcd - Perl-Probleme


Unten finden Sie eine alte, teilweise funktionierende Regex-Lösung. IchschwerIch empfehle Ihnen, es nicht zu verwenden.

Schnelle Antwort: Verwenden Sie nicht Notepad++, sondernDasJS-Snippet (geben Sie unten rechts Ihren Text ein und klicken Sie auf „Senden“). Ersetzen Sie bei Bedarf STARTund ENDim Skript unten links.

Alternativ können Sie PowerShell verwenden, das in Windows (Vista+) integriert ist:

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

Ersetzen Sie input.txtund output.txtentsprechend. Hinweis: Es müssen unterschiedliche Dateien sein.

Diese spezielle Lösung funktioniert nur dann fehlerfrei, wenn Sie nureinsVorkommen STARTpro ZeileUnd einsVorkommen ENDpro ZeileUndSie erstrecken sich nicht über mehrere Zeilen, sodass wir jede Zeile unabhängig behandeln können.


Angesichts der Garantie, dass nur eine Übereinstimmung pro Zeile erforderlich ist und jede Übereinstimmung in einer Zeile enthalten ist, (?<=START.*?)-(?=.*?END)würde das Abgleichen und Ersetzen durch ein einzelnes Leerzeichen funktionieren -außerNotepad++ scheint dieses spezielle Muster nicht zu mögen. Es unterstützt Lookbehinds und Lookaheads (offenbar vollständiges PCRE), aber irgendetwas daran bringt es zum Stolpern.

Eine Alternative, die der Antwort von Johannes ähnelt, besteht darin, ein einfaches Muster zu verwenden: (START.*?)-(.*?END)und es durch zu ersetzen \1 \2. Das Problem hierbei ist, dass dies nur mit übereinstimmteinsBindestrich pro Zeile auf einmal. Das wird schnell mühsam.

Hier versuchen wir, eine vollständigere Skriptsprache zu verwenden. JavaScript ist eine gute Alternative. Esnichtunterstützen Lookbehinds. Auf der positiven Seite können wir Dinge in einer Schleife ausführen, sodass die bisherige mühsame Lösung tatsächlich praktikabel ist. Ich habe ein Beispiel erstelltHier.

Antwort2

Ein geeigneter regulärer Ausdruck wäre (START[^\-]*)-(.*END). Ersetzen Sie diesen durch \1 \2und verwenden Sie „Alle ersetzen“ MEHRMALS (es wird nur einer ersetzt – in jeder Zeile pro Klick).

verwandte Informationen