您好。我需要一個能夠從字串中刪除重複字元的函數。
是什麼促使我提出這個願望清單請求呢?如果我有一個字串,其中包含重複的相同字符,有時我想刪除該字符的所有實例,只保留一個。例如,我有一個字串“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 迴圈簡潔多了。