もつ:
"a__b_c_____d__e_f__"
必要:
"a_b_c_d_e_f_"
"___"
つまり、すべてのサブストリング(1つ以上のアンダースコア)をループ"_"
のない(単一のアンダースコア)に置き換えます。
正規表現を使用します。例:
var input = "a__b_c_____d__e_f__";
var output = Regex.Replace(input, "_+", "_");
これは、次のようにRegularExpressionsを使用して実現できます。
string str = "a__b_c_____d__e_f__";
string newStr = System.Text.RegularExpressions.Regex.Replace(str, "_{2,}", "_");
var cleanString = Regex.Replace("a__b_c_____d__e_f__", "(_)+", "$1");
これで始められるはずです。
cat file | perl -e "s/\_+/\_/g"
この問題を解決するにはいくつかの方法がありますが、「ループなし」の意味が少しわかりません...
明らかに、次のようなループを使用できます。
while (myString.contains("__"))
myString.replace("__", "_");
これはあなたが避けようとしていることだと思いますが...キャッチは、どこかにループを含まない解決策があるとは思わないということです。.containsメソッドと.replaceメソッドは、どちらも実装でループを使用します。明確にするために、次のコードも機能します。
string outputStr = "";
bool underscore = false;
for(int i = 0; i < myString.length; ++i)
{
if (myString[i] == '_')
{
if (underscore == false)
outputStr += myString[i];
underscore = true;
}else outputStr += myString[i];
}
ご覧のとおり、これは1つのループのみを使用します。これはより効率的ですが(効率が問題になる場合は、outputStr変数に文字列の代わりにStringBuilderを使用することをお勧めします)、要点は、文字列を調べる必要がある場合は、次のことを行う必要があるということです。ループを作成するのがあなたであるか、それを実行する他のメソッドを呼び出しているかどうかにかかわらず、ループを使用します。