Hallo. Ich bin an einer Funktion interessiert, mit der man wiederholte Zeichen aus einer Zeichenkette entfernen kann.
Was hat diesen Wunsch geweckt? Angenommen, ich habe eine Zeichenkette mit einem sich wiederholenden Semikolon und möchte dieses Zeichen bis auf ein einziges entfernen. Zum Beispiel habe ich die Zeichenkette "input1;;;;input2;;;input3", und möchte sie in "input1;input2;input3" umwandeln. Ich ging davon aus, dass ich einfach `SubstituteInto(str, ";;", ";")` verwenden könnte, um alle wiederholten Semikolons rekursiv zu entfernen. Das funktionierte aber nicht. Stattdessen wurden nur die ersten beiden Semikolons durch ein einzelnes ersetzt, und dann war Schluss.
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
Beachten Sie, dass die erste Gruppe von Semikolons von 3 auf nur 2 reduziert wurde, die zweite Gruppe jedoch unverändert blieb. Meine aktuelle Lösung besteht darin, dies in eine while-Schleife einzubetten:
curlen = Length(str) + 1;
While(Length(str) < curlen,
SubstituteInto(str, ";;", ";");
); //returns "input1;input2;input3"
Welche Verbesserung würden Sie sich wünschen? Ich würde mir eine Änderung der Funktionen Substitute(), SubstituteInto() und Munger() wünschen, die eine "<< RECURSE"-Meldung enthält, die bewirkt, dass dieselbe Operation wie im obigen Code ausgeführt wird:
Substitute(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />SubstituteInto(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />Munger(s, startpos, findstringOrNChars,
<REPLACESTRING>
>);
</REPLACESTRING>
</RECURSE>
</IGNORECASE>
</RECURSE>
</IGNORECASE>
Alternativ könnte man, anstatt die bestehenden Funktionen zu ändern, vielleicht eine neue Funktion namens "Trim Multiple()" erstellen.
Trim Multiple(s, patternString);
Dabei ist s eine Zeichenkette und patternString besteht aus einem oder mehreren Zeichen. Der Code durchsucht s nach aufeinanderfolgenden Vorkommen von patternString. Wird ein solches Vorkommen gefunden, wird es durch ein einzelnes Vorkommen von patternString ersetzt, und die Suche in s wird fortgesetzt.
Warum ist diese Idee wichtig? Sie würde die Komplexität des Benutzercodes reduzieren. Außerdem würde sie dazu beitragen, Benutzern zu verdeutlichen, dass die Funktionen `Substitute()`, `SubstituteInto()` und `Munger()` nicht von Natur aus rekursiv sind, wodurch Fehler vermieden werden könnten.
Während Sie auf Trim Multiple() warten, können Sie eine Kombination aus Wörter() und concat items() verwenden:
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@hogi Danke für den Tipp. Das ist viel kompakter als meine While-Schleife.