Bonjour. Je suis intéressé par une fonction qui permettrait de supprimer les caractères répétés d'une chaîne de caractères.
Qu'est-ce qui a motivé cette demande ? J'ai une chaîne de caractères contenant un même caractère répété et je souhaite parfois supprimer toutes les occurrences de ce caractère sauf une. Par exemple, j'ai la chaîne « input1;;;;input2;;;input3 » et je veux la convertir en « input1;input2;input3 ». Je pensais pouvoir utiliser simplement `SubstituteInto(str, ";;", ";")` pour supprimer récursivement tous les points-virgules répétés, mais cela n'a pas fonctionné. Au lieu de cela, seuls les deux premiers points-virgules ont été remplacés par un seul point-virgule, puis la fonction s'est arrêtée.
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
Notez que le premier groupe de points-virgules a été réduit de 3 à seulement 2, tandis que le second n'a pas été affecté. Ma solution actuelle consiste à intégrer ce code dans une boucle while :
curlen = Length(str) + 1;
While(Length(str) < curlen,
SubstituteInto(str, ";;", ";");
); //returns "input1;input2;input3"
Quelle amélioration souhaiteriez-vous voir ? J’aimerais qu’une modification des fonctions Substitute(), SubstituteInto() et Munger() inclue un message « << RECURSE » qui leur permette d’effectuer la même opération que le code ci-dessus :
Substitute(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />SubstituteInto(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />Munger(s, startpos, findstringOrNChars,
<REPLACESTRING>
>);
</REPLACESTRING>
</RECURSE>
</IGNORECASE>
</RECURSE>
</IGNORECASE>
Autre solution, plutôt que de modifier les fonctions existantes, on pourrait peut-être créer une nouvelle fonction appelée « Trim Multiple() ».
Trim Multiple(s, patternString);
où s est une chaîne de caractères et patternString un ou plusieurs caractères. Le code recherche dans s les occurrences de patternString qui se répètent consécutivement. Lorsqu'il en trouve une, il la remplace par une seule occurrence de patternString et poursuit sa recherche dans s.
Pourquoi cette idée est-elle importante ? Elle simplifierait le code des utilisateurs. Elle permettrait également de souligner que les fonctions Substitute()/SubstituteInto()/Munger() ne sont pas intrinsèquement récursives, contribuant ainsi à prévenir les bogues.
En attendant Trim Multiple() , vous pouvez utiliser une combinaison de mots() et concaténer les éléments() :
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@hogi merci pour l'idée. C'est beaucoup plus compact que ma boucle while.