Erklärung des Find-Ausdrucks

Erklärung des Find-Ausdrucks

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:

  1. In der Ersetzungszeichenfolge \dbedeutet dies „drucke ein d“ und nichts weiter. Alle speziellen regulären Ausdrücke wie \dund \wusw. funktionieren nur im Suchmuster, nicht in der Ersetzungszeichenfolge.
  2. 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:

  1. 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.
  2. 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.
  3. 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 thisMuster \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 \dstimmt mit einer Ziffer überein, und die Gruppen \d\dund \d\d\dsorgen 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 thisdas \1durch die erste Erfassungsgruppe (die Leerzeichen) ersetzt. 1700, 170, und 17drucken Sie den Teil, der der Zeile hinzugefügt werden muss. Das \2wird 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“ $5entspricht 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.

verwandte Informationen