如何更换无限循环?

时间:2009-07-23 17:20:29

标签: c# string replace infinite-loop

我正在研究一些想要删除空白行的低效C#代码。它这样做:

            string b;
 ... 
            while ( b.IndexOf("\n\n") >= 0 )
                b = b.Replace ("\n\n", "\n");

单个替换不能处理(例如)输入中的\ n \ n \ n,因此需要循环。我认为它应该起作用,而且通常会起作用。

但有时它设法进入一个无限循环,我不明白如何。在每次迭代时,\ n的数量应该减少,所以它最终应该终止。

有什么想法吗?

5 个答案:

答案 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);
        }