我正在研究一些想要删除空白行的低效C#代码。它这样做:
string b; ... while ( b.IndexOf("\n\n") >= 0 ) b = b.Replace ("\n\n", "\n");
单个替换不能处理(例如)输入中的\ n \ n \ n,因此需要循环。我认为它应该起作用,而且通常会起作用。
但有时它设法进入一个无限循环,我不明白如何。在每次迭代时,\ n的数量应该减少,所以它最终应该终止。
有什么想法吗?
答案 0 :(得分:6)
这会有效吗?
String c = Regex.Replace(b, "\n\n+", "\n");
答案 1 :(得分:6)
我对你无法解释的无限循环没有解释(你是否认为它是无限的?你检查过它是否会改变?),但你可以用正则表达式更容易,更快地完成这个任务:
b = System.Text.RegularExpressions.Regex.Replace(b, "\n+", "\n")
答案 2 :(得分:0)
你能给出一个字符串的例子,这个字符串会进入无限循环吗?另外,为了调试您的程序,您可以尝试将其替换为:
while(b.IndexOf("\n\n")>=0)
{
Console.Write(b)
Console.Write(b.IndexOf("\n\n").ToString())
b = b.Replace("\n\n", "\n");
}
并查看它输出的内容。
答案 3 :(得分:0)
我只是把这个答案放在这里,以澄清一个点,以防其他人出现,并建议如果b是一个空字符串,上面发布的代码将无限循环。这是不正确的:
String b = String.Empty;
Console.WriteLine(b.IndexOf("\n\n"));
// output: -1
documentation表示如果传递给它的值参数,IndexOf
将返回0,而不是字符串本身(在本例中为b)为空。
答案 4 :(得分:0)
我已经将问题归结为一个讨厌的字符串,我通过阅读文件得到(下面的完整代码)。
文件s.tab包含这18个十六进制字节:FF FE 41 00 0D 0A 00 0D 0A 00 0D 0A 00 42 00
以下是我程序的调试输出:
b.Length=8 loop n=1, i=3, b=A??
?? B
stuck at i=3, b(i)=10 2573 3328...
done n=1, i=3, b=A??
?? B
所以它与无效的unicode有关。我打印出字符串b的字符的十进制值,从i = 3 = IndexOf(“\ n \ n”)开始。 IndexOf似乎将10视为新行(OK),然后将2573(即0D 0A)视为另一行(不是吗?)。然后替换不同意。
显然文件中的数据有问题。但我仍然认为这不会发生。 IndexOf和Replace应该同意。
我正在实施msaeed的解决方案。非常感谢。
调试代码:
{
System.IO.StreamReader aFile = System.IO.File.OpenText( @"c:\xfer\s.tab");
string a = aFile.ReadToEnd();
aFile.Close();
int nn=0, ii;
Console.WriteLine ("a.Length={0}", a.Length);
while ( (ii=a.IndexOf("\n\n")) >= 0 )
{
nn++;
Console.WriteLine("loop n={0}, i={1}, a={2}"
, nn
, ii
, a);
if (ii == a.IndexOf("\n\n"))
{
Console.WriteLine ("stuck at i={0}, a(i)={1} {2} {3}..."
, ii
, (int)(a.ToCharArray()[ii])
, (int)(a.ToCharArray()[ii+1])
, (int)(a.ToCharArray()[ii+2])
);
break;
}
a = a.Replace ("\n\n", "\n");
}
Console.WriteLine("done n={0}, i={1}, a={2}", nn, ii, a);
}