0

我正在编写一些效率相当低的 C# 代码,这些代码想要删除空白行。它这样做:

            字符串 b;
 ...
            而 ( b.IndexOf("\n\n") >= 0 )
                b = b.替换("\n\n", "\n");

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

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

有任何想法吗?

4

5 回答 5

6

这会起作用吗:

String c = Regex.Replace(b, "\n\n+", "\n");
于 2009-07-23T17:24:22.370 回答
6

我没有解释你莫名其妙的无限循环(你确定它是无限的吗?你检查过字符串是否改变了吗?),但你可以用正则表达式更容易和更快地做到这一点:

b = System.Text.RegularExpressions.Regex.Replace(b, "\n+", "\n")
于 2009-07-23T17:25:36.970 回答
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)视为另一个(不是 OK?)。然后替换不同意。

显然文件中的数据有问题。但我仍然认为这不应该发生。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);
        }
于 2009-07-24T15:08:15.150 回答
0

你能举一个这个进入无限循环的字符串的例子吗?另外要调试您的程序,您可以尝试将其替换为:

while(b.IndexOf("\n\n")>=0)
{
     Console.Write(b)
     Console.Write(b.IndexOf("\n\n").ToString())
     b = b.Replace("\n\n", "\n");
}

看看它输出了什么。

于 2009-07-23T17:24:47.283 回答
0

我只是将这个答案放在这里以澄清一点,以防其他人出现并建议如果 b 是空字符串,上面发布的代码将无限循环。这是不正确的:

String b = String.Empty;

Console.WriteLine(b.IndexOf("\n\n"));

// output: -1

文档指出,如果传递给它的 value参数为空,而不是字符串本身(在本例中为 b)为空,IndexOf则将返回 0 。

于 2009-07-23T17:45:08.163 回答