C#控制台Word Wrap

问题描述 投票:-2回答:2

我有一个带换行符的字符串,我想要包装这些单词。我想保留换行符,以便在显示文本时看起来像是单独的段落。任何人都有很好的功能吗?下面的当前功能和代码。(不是我自己的功能)。 WordWrap函数似乎正在剥离\ n字符。

static void Main(string[] args){

        StreamReader streamReader = new StreamReader("E:/Adventure Story/Intro.txt");

        string intro = "";
        string line;

        while ((line = streamReader.ReadLine()) != null)
        {
            intro += line;
            if(line == "")
            {
                intro += "\n\n";
            }
        } 
        WordWrap(intro);

public static void WordWrap(string paragraph)
    {
        paragraph = new Regex(@" {2,}").Replace(paragraph.Trim(), @" ");
        var left = Console.CursorLeft; var top = Console.CursorTop; var lines = new List<string>();
        for (var i = 0; paragraph.Length > 0; i++)
        {
            lines.Add(paragraph.Substring(0, Math.Min(Console.WindowWidth, paragraph.Length)));
            var length = lines[i].LastIndexOf(" ", StringComparison.Ordinal);
            if (length > 0) lines[i] = lines[i].Remove(length);
            paragraph = paragraph.Substring(Math.Min(lines[i].Length + 1, paragraph.Length));
            Console.SetCursorPosition(left, top + i); Console.WriteLine(lines[i]);
        }
    }
c# console-application
2个回答
0
投票

如果您希望另一个换行符使文本看起来像段落,只需使用String对象的Replace方法。

        var str =
            "Line 1\n" +
            "Line 2\n" +
            "Line 3\n";

        Console.WriteLine("Before:\n" + str);

        str = str.Replace("\n", "\n\n");

        Console.WriteLine("After:\n" + str);

0
投票

这是一个自动换行功能,它通过使用正则表达式来查找可以中断的位置以及它必须断开的位置。然后它根据“中断区域”返回原始文本的片段。它甚至允许在连字符(和其他字符)处断开而不删除连字符(因为正则表达式使用零宽度正向前瞻断言)。

    IEnumerable<string> WordWrap(string text, int width)
    {
        const string forcedBreakZonePattern = @"\n";
        const string normalBreakZonePattern = @"\s+|(?<=[-,.;])|$";

        var forcedZones = Regex.Matches(text, forcedBreakZonePattern).Cast<Match>().ToList();
        var normalZones = Regex.Matches(text, normalBreakZonePattern).Cast<Match>().ToList();

        int start = 0;

        while (start < text.Length)
        {
            var zone = 
                forcedZones.Find(z => z.Index >= start && z.Index <= start + width) ??
                normalZones.FindLast(z => z.Index >= start && z.Index <= start + width);

            if (zone == null)
            {
                yield return text.Substring(start, width);
                start += width;
            }
            else
            {
                yield return text.Substring(start, zone.Index - start);
                start = zone.Index + zone.Length;
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.