【问题标题】:How to split strings on carriage return with C#?如何使用 C# 在回车符上拆分字符串?
【发布时间】:2010-12-21 08:04:34
【问题描述】:

我有一个 ASP.NET 页面,其中包含一个名为 txbUserName 的多行文本框。然后我将 3 个名称粘贴到文本框中,它们是垂直对齐的:

  • 杰森
  • 艾米
  • 卡伦

每当我检测到回车或换行时,我希望能够以某种方式获取名称并将它们拆分为单独的字符串。我在想一个数组可能是要走的路。 有什么想法吗?

谢谢。

【问题讨论】:

    标签: c# text-manipulation


    【解决方案1】:
    string[] result = input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
    

    这涵盖了 \n 和 \r\n 换行符类型,并删除了用户可能输入的任何空行。

    我使用以下代码进行了测试:

            string test = "PersonA\nPersonB\r\nPersonC\n";
            string[] result = test.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
            foreach (string s in result)
                Console.WriteLine(s);
    

    它工作正常,分成三个字符串数组,其中包含条目“PersonA”、“PersonB”和“PersonC”。

    【讨论】:

    • 是否可以保证这不会首先被 \n 分割,而将 \r\n 缩减为 \r?
    • 我很确定它不会。我在工作中的应用程序中使用这一行,它用于一次解析一个剪贴板(不知何故,用户需要在 Windows 上使用 UNIX 行结尾......)。但是,如果确实如此,我想反转字符串数组参数中的字符串可以解决这个问题。有谁知道如何生成两者的混合进行测试?
    • @jasonh:“我很确定”...著名的遗言。 :)
    • @jasonh:随着在 Windows 和 Linux 上都使用工具和应用程序,界限变得有些模糊,实际上,在任何一个上运行的任何应用程序都应该能够优雅地处理任一行结束。
    • 如果您想确保拆分 CR 或 LF 的所有组合,那么您可以这样做:string[] result = input.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    【解决方案2】:

    将任何\r\n 替换为\n,然后使用\n 拆分:

    string[] arr = txbUserName.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
    

    【讨论】:

    • 为什么不使用new char[] { '\n' }
    • @Matthew:旧习惯难改:P
    • @Matthew, @o.k.w:或者甚至只使用Split('\n'),因为分隔符数组是params 参数。
    【解决方案3】:

    看一下 String.Split 函数(不确定确切的语法,我面前没有 IDE)。

    string[] names = txbUserName.Text.Split(Environment.Newline);
    

    【讨论】:

    • Environment.Newline 是服务器环境的“换行符”表示,它不控制用户可以输入的内容,是吗?
    • 如果一个常数可以控制用户可以输入的内容,那么我会购买更多的微软股票......更多很多
    • FWIW - 最好使用“\r”和/或“\n”,我的回答更侧重于“仅使用 .split”来分解字符串。很高兴您不必在 C 中编写 .split 并自己管理内存和指针!我告诉你,年轻的鲷鱼很容易。
    【解决方案4】:

    String.Split?

    mystring.Split(new Char[] { '\n' })
    

    【讨论】:

      【解决方案5】:
      using System.Text;
      using System.Text.RegularExpressions;
      
      
       protected void btnAction_Click(object sender, EventArgs e)
          {
              string value = txtDetails.Text;
              char[] delimiter = new char[] { ';','[' };
              string[] parts = value.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
              for (int i = 0; i < parts.Length; i++)
              {
                  txtFName.Text = parts[0].ToString();
                  txtLName.Text = parts[1].ToString();
                  txtAge.Text = parts[2].ToString();
                  txtDob.Text = parts[3].ToString();
              }
          }
      

      【讨论】:

        【解决方案6】:

        试试这个:

        message.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        

        适用于:

        var message = "test 1\r\ntest 2";
        

        或者

        var message = "test 1\ntest 2";
        

        或者

        var message = "test 1\rtest 2";
        

        【讨论】:

          【解决方案7】:

          这取决于你想做什么。另一种选择是使用StringReader 类并使用枚举器,这对于小列表可能有点过分,但对于较大的字符串可能更节省内存:

          IEnumerable<string> GetNextString(string input)
          {
              using (var sr = new StringReader(input))
              {
                  string s;
                  while ((s = sr.ReadLine()) != null)
                  {
                      yield return s;
                  }
              }
          }
          

          这支持\n\r\n 行尾。当它返回 IEnumerable 时,您可以使用 foreach 处理它,或使用任何标准 linq 扩展(ToList()ToArray()Where 等)。

          例如,foreach:

          var ss = "Hello\nworld\r\ntwo bags\r\nsugar";
          foreach (var s in GetNextString(ss))
          {
              Console.WriteLine("==> {0}", s);
          }
          

          【讨论】:

            猜你喜欢
            • 2015-01-21
            • 1970-01-01
            • 1970-01-01
            • 2013-10-28
            • 2012-03-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多