こんにちは。文字列から重複した文字を削除できる関数に興味があります。
このウィッシュリストのリクエストのきっかけは何だったのでしょうか?同じ文字が繰り返して含まれる文字列があり、その文字を1つだけ残してすべて削除したい場合があります。例えば、「input1;;;;input2;;;input3」という文字列があり、これを「input1;input2;input3」に変換したいとします。SubstituteInto(str, ";;", ";") を使えば、繰り返しの「;」をすべて再帰的に削除できると思っていましたが、そうではありませんでした。代わりに、最初の2つのセミコロンを1つのセミコロンに置き換えて、それ以上は削除しませんでした。
str = "input1;;;input2;;;input3";<BR />SubstituteInto(str, ";;", ";");<BR />Show(str); //returns "input1;;input2;;;input3"
最初のセミコロンが3個から2個に減り、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 は1文字以上の文字です。このコードは、s 内で連続して繰り返される patternString のインスタンスを検索します。見つかった場合は、それを patternString のインスタンス1つに置き換え、s 内でさらに patternString のインスタンスを検索し続けます。
このアイデアがなぜ重要なのか?これはユーザーのコードの複雑さを軽減します。また、Substitute()/SubstituteInto()/Munger()関数が本質的に再帰的ではないことをユーザーに明確に伝える手段にもなり、バグの防止にも役立ちます。
複数をトリム()を待つ間に、 単語()と項目を連結する()の組み合わせを使用できます。
str = "input1;;;input2;;;input3";
Show(concat items(Words(str, ";"), ";"))
@hogiアイデアをありがとう。これは私のwhileループよりもずっとコンパクトです。