Hola. Estoy interesado en una función que pueda usarse para eliminar caracteres repetidos de una cadena.
¿Qué inspiró esta solicitud de lista de deseos? Si tengo una cadena que contiene el mismo carácter repetido y a veces quiero eliminar todas las instancias de ese carácter menos una. Por ejemplo, tengo una cadena como "input1;;;;input2;;;input3" y quiero convertirla a "input1;input2;input3". Supuse que podría usar SubstituteInto(str, ";;", ";") y que eliminaría recursivamente todos los ";" repetidos, pero no lo hizo. En su lugar, solo reemplazaría los dos primeros puntos y comas con un solo punto y coma y luego se detendría.
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
Tenga en cuenta que el primer conjunto de puntos y comas se redujo de 3 a solo 2, y el segundo conjunto no se vio afectado en absoluto. Mi solución actual consiste en incrustar esto en un bucle while:
curlen = Length(str) + 1;
While(Length(str) < curlen,
SubstituteInto(str, ";;", ";");
); //returns "input1;input2;input3"
¿Qué mejora le gustaría ver? Me gustaría ver una modificación en las funciones Substitute(), SubstituteInto() y Munger() para incluir un mensaje "<< RECURSE" que simplemente haga que realice la misma operación que el código anterior:
Substitute(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />SubstituteInto(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />Munger(s, startpos, findstringOrNChars,
<REPLACESTRING>
>);
</REPLACESTRING>
</RECURSE>
</IGNORECASE>
</RECURSE>
</IGNORECASE>
Alternativamente, en lugar de cambiar las funciones establecidas, tal vez se podría crear una nueva función llamada "Trim Multiple()".
Trim Multiple(s, patternString);
Donde s es una cadena y patternString es uno o más caracteres. El código buscará en s cualquier instancia de patternString que se repita consecutivamente. Si encuentra una, la reemplaza con una sola instancia de patternString y continúa buscando en s más instancias de patternString.
¿Por qué es importante esta idea? Reduciría la complejidad del código de usuario. Además, sería una forma de mostrarles a los usuarios que las funciones Substitute()/SubstituteInto()/Munger() no son inherentemente recursivas, lo que ayudaría a prevenir errores.
Mientras espera a Recortar múltiples() , puede utilizar una combinación de palabras() y concat elementos() :
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@hogi, gracias por la idea. Esto es mucho más compacto que mi bucle while.