Ciao. Sono interessato a una funzione che possa essere utilizzata per rimuovere i caratteri ripetuti da una stringa.
Cosa mi ha ispirato a questa richiesta di lista dei desideri? Se ho una stringa che contiene lo stesso carattere ripetuto e a volte voglio rimuovere tutte le istanze di quel carattere tranne una. Ad esempio, ho una stringa come "input1;;;;input2;;;input3" e voglio convertirla in "input1;input2;input3". Ho pensato di poter semplicemente usare SubstituteInto(str, ";;", ";") e che avrebbe rimosso ricorsivamente tutti i ";" ripetuti, ma non l'ha fatto. Invece avrebbe sostituito solo i primi 2 punti e virgola con un singolo punto e virgola, per poi fermarsi.
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
Si noti che il primo set di punti e virgola è stato ridotto da 3 a solo 2, mentre il secondo set non è stato modificato. La mia attuale soluzione alternativa consiste nell'incorporare questo in un ciclo while:
curlen = Length(str) + 1;
While(Length(str) < curlen,
SubstituteInto(str, ";;", ";");
); //returns "input1;input2;input3"
Qual è il miglioramento che vorresti vedere? Vorrei vedere una modifica alle funzioni Substitute(), SubstituteInto() e Munger() per includere un messaggio "<< RECURSE" che faccia semplicemente eseguire la stessa operazione del codice sopra:
Substitute(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />SubstituteInto(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />Munger(s, startpos, findstringOrNChars,
<REPLACESTRING>
>);
</REPLACESTRING>
</RECURSE>
</IGNORECASE>
</RECURSE>
</IGNORECASE>
In alternativa, invece di modificare le funzioni stabilite, si potrebbe forse creare una nuova funzione chiamata "Trim Multiple()"
Trim Multiple(s, patternString);
dove s è una stringa e patternString è uno o più caratteri. Il codice cercherà in s tutte le istanze di patternString ripetute consecutivamente. Dove ne trova una, la sostituisce con una sola istanza di patternString e continua a cercare in s altre istanze di patternString.
Perché questa idea è importante? Ridurrebbe la complessità del codice degli utenti. Sarebbe anche un modo per evidenziare agli utenti che le funzioni Substitute()/SubstituteInto()/Munger() non sono intrinsecamente ricorsive, e così facendo si contribuirebbe a prevenire bug.
Mentre si attende Trim Multiple() , è possibile utilizzare una combinazione di parole() e concatena elementi() :
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@hogi grazie per l'idea. È molto più compatto del mio ciclo while.