【问题标题】:How to reliably split the contents of a TextBox into lines?如何可靠地将 TextBox 的内容拆分为行?
【发布时间】:2015-12-03 22:31:59
【问题描述】:

当我得到TextBox.Text 时,如何将其拆分成行?

对于文本文件,我通过在\r\n (Notepad++) 处拆分来实现。对于TextBox,通常是\r\n,但显然并非总是如此——因为我的\r\n 拆分有时会因粘贴输入而失败。幸运的是,对于文本文件,我可以使用 Notepad++ 的“显示所有字符”功能来检查空格。但是如何查看TextBox 中的字符?

显然TextBox 本身知道如何处理这个问题,因为它能够在正确的位置显示带有换行符的文本。我如何在TextBox 会显示中断的每个位置使用var s = MyTextBox.Text; 和“拆分s”?

编辑:我检查了我的正则表达式,实际上我已经在 Environment.Newline 拆分,而不是 \r\n

【问题讨论】:

  • 如果您使用的是 RichTextBox,它实际上有一个名为“lines”的属性。
  • @Rariolu 标准的 TextBox 也有。
  • 有趣的是 TextBox.Lines 不使用 Environment.NewLine,如果它看到 \n\r 就会换行。用户可能正在从一些不是在 Windows 中创建的源中复制文本

标签: c# winforms debugging textbox line-breaks


【解决方案1】:

你可以使用

var lines = Regex.Split(s, @"\r\n|\r|\n");

在任何换行符处可靠地拆分,无论换行符来自何处。

【讨论】:

    【解决方案2】:

    对于TextBox,您可以按照cmets 中的建议使用Lines 属性。但在其他情况下,您可能也需要从字符串中获取行。

    为此,我使用基于StringReader 的扩展方法:

    public static IEnumerable<string> GetLines(this string s)
    {
        using (var reader = new StringReader(s))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }
    

    (这个方法在我的NString library也有)

    你可以这样使用它:

    string[] lines = textBox.Text.GetLines().ToArray();
    

    StringReader 类知道在哪里分割线,它可能比使用正则表达式更快(只是一种直觉,我实际上并没有对其进行基准测试 编辑:我刚刚做了一个快速的基准测试,StringReaderRegex 快大约 6 倍)

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多