1

有:

"a__b_c_____d__e_f__"

需要:

"a_b_c_d_e_f_"

即:将所有"___"子字符串(1 个或多个下划线)替换为"_"(单个下划线)而不使用循环

4

5 回答 5

13

使用正则表达式,例如

var input = "a__b_c_____d__e_f__";
var output = Regex.Replace(input, "_+", "_");
于 2012-07-23T20:04:33.907 回答
1

您可以通过使用正则表达式来实现这一点,如下所示

string str = "a__b_c_____d__e_f__";
string newStr = System.Text.RegularExpressions.Regex.Replace(str, "_{2,}", "_");
于 2012-07-23T20:05:28.560 回答
0
 var cleanString = Regex.Replace("a__b_c_____d__e_f__", "(_)+", "$1");
于 2012-07-23T20:06:50.103 回答
-1

有几种方法可以解决这个问题,但我有点不确定你所说的“没有循环”是什么意思......

显然你可以使用一个循环,例如:

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];
}

如您所见,这只使用了一个循环。虽然这更有效,(如果效率是一个问题,您可能希望使用 StringBuilder 而不是字符串作为 outputStr 变量)关键是如果您需要查看字符串,您将不得不使用循环,无论是您编写循环还是调用其他为您执行此操作的方法。

于 2012-07-23T20:17:49.783 回答
-1

这应该让你开始。

cat file | perl -e "s/\_+/\_/g"
于 2012-07-23T20:03:04.493 回答