您好。我需要一个能够从字符串中删除重复字符的函数。
是什么促使我提出这个愿望清单请求呢?如果我有一个字符串,其中包含重复的相同字符,有时我想删除该字符的所有实例,只保留一个。例如,我有一个字符串“input1;;;;input2;;;input3”,我想把它转换成“input1;input2;input3”。我原以为可以使用 `SubstituteInto(str, ";;", ";")` 来递归地删除所有重复的“;”,但结果并非如此。它只会将前两个分号替换成一个分号,然后就停止了。
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
请注意,第一组分号从 3 个减少到 2 个,而第二组分号则完全不受影响。我目前的解决方法是将其嵌入到 while 循环中:
curlen = Length(str) + 1;
While(Length(str) < curlen,
SubstituteInto(str, ";;", ";");
); //returns "input1;input2;input3"
您希望看到哪些改进?我希望对 Substitute()、SubstituteInto() 和 Munger() 函数进行修改,添加一条“<< RECURSE”消息,使其执行与上述代码相同的操作:
Substitute(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />SubstituteInto(x, patternString1, replacementString1, ..., < <
<IGNORECASE>
, < <
<RECURSE>
);
<BR />Munger(s, startpos, findstringOrNChars,
<REPLACESTRING>
>);
</REPLACESTRING>
</RECURSE>
</IGNORECASE>
</RECURSE>
</IGNORECASE>
或者,与其更改现有函数,不如创建一个名为“Trim Multiple()”的新函数。
Trim Multiple(s, patternString);
其中 s 是一个字符串,patternString 是一个或多个字符。这段代码会在 s 中搜索所有连续重复的 patternString 实例。如果找到,则将其替换为单个 patternString 实例,并继续在 s 中搜索更多 patternString 实例。
为什么这个想法很重要?它可以降低用户代码的复杂度。此外,它还能帮助用户意识到 Substitute()/SubstituteInto()/Munger() 函数本质上并非递归函数,从而有助于防止错误发生。
在等待Trim Multiple() 函数执行期间,您可以结合使用字()和concat items() 函数:
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@hogi谢谢你的建议。这比我的 while 循环简洁多了。