
Ich habe mehrere Textdateien mit etwas Ähnlichem wie den folgenden Beispielen:
{
{
1,
text1,
text2,
}
}
{
{
52,
text1,
text2,
}
}
{
{
105,
text1,
text2,
}
}
ich habe mich gefragt, wie ich mehrere Dateien gleichzeitig durchsuchen und sie wie folgt ersetzen kann:
{
{
17001,
text1,
text2,
}
}
{
{
17052,
text1,
text2,
}
}
{
{
17105,
text1,
text2,
}
}
im Grunde würde ich zu jeder der ersten Zahlen nach jeder doppelten öffnenden Klammer 17.000 hinzufügen. Ich habe versucht, Zahlen durch \d\d\d durch 17\d\d\d zu ersetzen, aber dann würde ich den Buchstaben 17ddd erhalten, nicht die Zahl. Bitte helfen Sie mir
Antwort1
Sie haben zwei Probleme:
- In der Ersetzungszeichenfolge
\d
bedeutet dies „drucke eind
“ und nichts weiter. Alle speziellen regulären Ausdrücke wie\d
und\w
usw. funktionieren nur im Suchmuster, nicht in der Ersetzungszeichenfolge. - Wie @DavidPostill sagte, kann Notepad++ bei der Suche/Ersetzung mit regulären Ausdrücken keine mathematischen Berechnungen durchführen.
Sie haben drei Möglichkeiten, das zu tun, was Sie möchten:
- Verwenden Sie ein Programm, Skript oder Plugin, um die Ersetzungen für Sie vorzunehmen. Jede Version davon ist, wie der zuvor erwähnte Kommentar sagt, hier nicht zum Thema.
- Verwenden Sie die Suchen- und Ersetzen-Funktion von Notepad++ dreimal.
- Runde eins für eine einzelne Ziffer,
- Runde zwei für zwei Ziffern und
- Runde drei für dreistellige Zahlen.
- Wenn Sie Notepad++ höher als v6.0 haben, können Sie PCRE-Syntax im regulären Ausdruck verwenden und denausgezeichnete Antwortvon @ACR, um alles in einem Durchgang zu erledigen.
Um dies mit der Drei-Durchgangs-Methode zu erreichen, führen Sie die folgenden Schritte aus. Möglicherweise müssen Sie die Suchmuster ändern, um das zu erfassen, was Sie wollen, und zwar nur das, was Sie wollen. Sie funktionieren in dem oben angegebenen Beispiel, aber Ihre Dateien sind möglicherweise komplexer als das Beispiel.
Runde eins
Finde das:
(\s+)(\d),
Ersetzen Sie es durch Folgendes:
\11700\2,
Runde Zwei
Finde das:
(\s+)(\d\d),
Ersetzen Sie es durch Folgendes:
\1170\2,
Runde Drei
Finde das:
(\s+)(\d\d\d),
Ersetzen Sie es durch Folgendes:
\117\2,
Was es macht
Im Find this
Muster \s+
findet es alle Leerzeichen, die vor dem nächsten Token gefunden werden können, wobei mindestens eines erforderlich ist, um zu verhindern, dass eine Zahl nach etwas anderem als einem Leerzeichen abgeglichen wird. Das ()
drumherum macht es zur ersten erfassten Zeichenfolge, die von der Übereinstimmung zurückgegeben wird. Das \d
stimmt mit einer Ziffer überein, und die Gruppen \d\d
und \d\d\d
sorgen dafür, dass es stattdessen genau mit 2 oder 3 Ziffern übereinstimmt. Auch hier ()
macht das daraus eine Erfassungsgruppe, diesmal die zweite. Schließlich ,
stimmt das mit dem Komma nach den Zahlen überein, wodurch es in Ihrer Beispieldatei in derselben Zeile bleibt.
In wird Replace with this
das \1
durch die erste Erfassungsgruppe (die Leerzeichen) ersetzt. 1700
, 170
, und 17
drucken Sie den Teil, der der Zeile hinzugefügt werden muss. Das \2
wird durch die zweite Erfassungsgruppe ersetzt, also die Ziffer(n), die Sie im Suchmuster haben. Schließlich ,
wird das Komma explizit ersetzt, anstatt eine Erfassungsgruppe dafür zu verschwenden.
Antwort2
Dies können Sie mit einer einzigen Suchen-und-Ersetzen-Funktion erreichen. Notepad++ ermöglicht Ihnen eine bedingte Ersetzung, je nachdem, ob eine Gruppe übereinstimmt.
Finde was:
^(\s*)(\d{3})?(\d{2})?(\d{1})?(,\s*)$
Ersetzen mit:
$1(?{2}17$2)(?{3}170$3)(?{4}1700$4)$5
Erklärung des Find-Ausdrucks
Von außen nach innen vorgehen:
- Die Zeichen
^
und$
markieren jeweils den Anfang und das Ende einer Zeile. - Das
(\s*)
entspricht dem Leerzeichen am Anfang und das(,\s*)
entspricht dem Komma und allen nachfolgenden Leerzeichen am Ende der Zeile. - In der Mitte haben wir drei verschiedene Gruppen, die entweder 3, 2 oder 1 Ziffern entsprechen (unter Verwendung der
{n}
Syntax). Auf jede Gruppe folgt ein?
, um sie als möglicherweise nicht übereinstimmend zu markieren. Die Reihenfolge der Gruppen ist wichtig, da die Gruppen in der Reihenfolge abgeglichen werden, in der sie erscheinen. Wenn es drei Ziffern gibt, stimmt die erste Gruppe überein, und es bleiben keine Ziffern für die folgenden zwei Gruppen übrig, die übereinstimmen. Wenn es zwei Ziffern gibt, stimmt die erste Gruppe nicht überein, die zweite Gruppe stimmt überein, und die erste Gruppe hat keine übereinstimmenden Ziffern.
Erklärung des Ersetzen-Ausdrucks
- Das
$1
„und“$5
entspricht dem Leerzeichen am Anfang der Zeile und dem Komma und dem Leerzeichen am Ende der Zeile. - An die folgenden Gruppen (in umgekehrter Reihenfolge aufgelistet) wird „17“ plus die korrekte Anzahl von Nullen angehängt, je nachdem, welche Gruppe im Suchausdruck übereinstimmt. Nehmen wir beispielsweise die erste Gruppe
(?{2}17$2)
. Es?{2}
wird geprüft, ob eine Übereinstimmung mit Gruppe 2 vorliegt oder nicht. Wenn ja, wird der folgende Text eingefügt: „17“ plus die Übereinstimmung für Gruppe 2, die eine dreistellige Zahl sein sollte.