Suchen, bearbeiten und ersetzen

Eine meiner Lieblingsneuerungen bei InDesign CS3 war die Möglichkeit mit Hilfe von Regulären Ausdrücken Suche/Ersetze-Vorgänge durchzuführen. Hier soll es aber nicht um die erweiterten Möglichkeiten der GREP-Funktion gehen.
Oftmals egibt sich in der Praxis die Anforderung, zunächst bestimmte Stellen in einem Dokument zu finden, diese dann allerdings nicht einfach zu ersetzen, sondern vorher nach bestimmten Regeln zu bearbeiten.
Dazu habe ich ein recht übersichtliches FindAndDo-Script geschrieben, in dem dann nur noch die Suchbedingung und die Verarbeitungsanweisung eingetragen werden muss.
Ein nicht zu vernachlässigender Punkt ist die rückwärts laufende For-Schleife: Wenn auf der Trefferliste Ersetzungen vorgenommen werden die eine veränderte Anzahl an Zeichen aufweisen, ändert sich der Index des Elternelements auf dem gesucht wurde. Die Folge ist, dass die darauf folgenden Ersetzungen an falschen Stellen ausgeführt werden (dem ursprünglichen Index).
Vielleicht mal das letzte Beispiel aus der Praxis damit es klarer wird: Alle Seitenverweise in einem Dokument waren vom Verlag per Hand aufgelöst worden, nun verschob sich der Umbruch ab Seite 106 um vier Seiten. Mit der normalen Suchfunktion hätte das bedeutet, alle Seitenverweise von Hand durchzugehen und je nach Postion zu verädern oder zu ignorieren. Bei 500 Verweisen wäre das ganze recht zeitaufwändig geworden, das Skript sieht dann so aus:

    // Zunächst alte Suchoptionen löschen, ich verwende hier die Grep Suche
    app.changeGrepPreferences = NothingEnum.nothing;
    app.findGrepPreferences = NothingEnum.nothing;
    // Nach Seitenverweisen des Typs (S. 99) suchen
    app.findGrepPreferences.findWhat = "\\(S..([0-9]+?)\\)";
    var erg = app.activeDocument.findGrep ();	

    for (var i = erg.length - 1; i >= 0; i--) {
        // Die Seitenzahl extrahieren
        var string = erg[i].contents.match (/[0-9]+/) ;
        // Wenn die Seitenzahl größer 106 ist wird sie erhöht
        if (parseInt(string) >= 106 ) {
            string = (parseInt(string) + 4);
        }
        erg[i].contents = "(S. " +  string + ")";
    }

PS: Die Seitenauflösung von Hand wäre auch überflüssig gewesen, wenn der Workflow von Anfang an sinnvoll geplant gewesen wäre …
PPS: Bei der Übergabe von Grep Suchanfragen müssen die Javascript String Konventionen beachtet werden, d.h. im besonderen die Forward-Slashes und Quotes müssen mit dem Forward-Slashe escaped werden (z.B. //). Ich empfehle im DEBUG Modus die Übergabe an das Suchfeld zu testen.