有:
"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, "_+", "_");
您可以通过使用正则表达式来实现这一点,如下所示
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");
有几种方法可以解决这个问题,但我有点不确定你所说的“没有循环”是什么意思......
显然你可以使用一个循环,例如:
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 变量)关键是如果您需要查看字符串,您将不得不使用循环,无论是您编写循环还是调用其他为您执行此操作的方法。
这应该让你开始。
cat file | perl -e "s/\_+/\_/g"