【问题标题】:How can I convert a string with newlines in it to separate lines?如何将带有换行符的字符串转换为单独的行?
【发布时间】:2010-08-24 08:10:04
【问题描述】:

如何将具有\r\n 的字符串转换为行?

例如,取这个字符串:

string source = "hello \r\n this is a test \r\n tested";

以及如何将其转换为:

string[] lines ;

//lines[0] = hello;
//lines[1] = this is a test;
//lines[2] = tested ;

【问题讨论】:

    标签: c#


    【解决方案1】:

    像这样使用String.Split Method (String[], StringSplitOptions)

    var lines = source.Split(new [] { "\r\n", "\n" }, StringSplitOptions.None);
    

    无论源代码是使用 Windows linebreak \r\n 还是 Unix \n 编写的,这个都可以工作。

    正如其他答案所提到的,您可以使用StringSplitOptions.RemoveEmptyEntries 而不是StringSplitOptions.None,顾名思义,它会删除空字符串(" " 不符合为空的条件,只有""does)。

    【讨论】:

    • 您也可以添加 Mac:\r 以及用于 IBM 的 \x0085(请参阅 this note):)
    • 不知道他们有\r,但我只在Mac OS <= 9 上看到它,所以它们不相关。
    • @m0rb 如果您还希望它与来自其他平台的文档一起使用,则不是。
    • @lasseespeholt:当然,取决于是否创建了字符串。
    • @m0rb 是的,但我的解决方案是独立于平台的(大部分情况见上文),并且在解析行时,MS 也会做同样的事情(见我的其他答案)。但是,是的,如果你只应该使用一个常量 Environment.NewLine 绝对是要走的路 - 但我认为处理不同的文件更好:)
    【解决方案2】:

    除了上面提到的string.Split,你还可以使用Regex.Split,但是对于更复杂的分割模式,它通常更有用。

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

    【讨论】:

    • 我会说正则表达式会是更好的解决方案;如果您还想删除换行符前后的空格,或者没有回车时。正则表达式将是这样的:@" *\r?\n *"
    • @Andre:我同意你不能 100% 确定输入。然后你可以用正则表达式得到更好的模糊分割。如果您自己创建文件,则可能没有必要。
    【解决方案3】:
    string text = "Hello \r\n this is a test \r\n tested";
    string[] lines = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (string line in lines) {
        System.Diagnostics.Debug.WriteLine(line);
    }
    

    您可以使用overloads of System.String.Split 将单个字符、字符数组或字符串值数组用作分隔字符串的分隔符。 StringSplitOptions 指定是否保留空行或删除它们。 (例如,如果您要拆分段落等多行文本,您可能希望保留它们,但会在名称列表示例中删除它们)

    【讨论】:

      【解决方案4】:

      试试

      string[] items = source.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
      

      【讨论】:

      • 他没有说要删除空条目。
      【解决方案5】:

      为了清楚起见,我做了另一个答案。

      我做了这两种扩展方法:

      ReadLines 将让您一次读取一行,而无需将整个字符串解析为数组。 ReadAllLines 会将整行解析成一个数组。

      在你的情况下,你可以像这样使用它:

      var lines = source.ReadAllLines();
      

      我取自 File.ReadLinesFile.ReadAllLines 的名称,因此它们应该与 .Net 框架的其余部分保持一致。

      作为对我的另一个答案的 cmets 的附注,我检查了 StringReader.ReadLine 的代码,这确实处理了 \r\n\n - 但不是旧的遗留 Mac Os 等(应该不重要)。

      public static class StringExtensions
      {
          public static IEnumerable<string> ReadLines(this string data)
          {
              using (var sr = new StringReader(data))
              {
                  string line;
      
                  while ((line = sr.ReadLine()) != null)
                      yield return line;
              }
          }
      
          public static string[] ReadAllLines(this string data)
          {
              var res = new List<string>();
      
              using (var sr = new StringReader(data))
              {
                  string line;
      
                  while ((line = sr.ReadLine()) != null)
                      res.Add(line);
              }
      
              return res.ToArray();
          }
      }
      

      ReadAllLines 可以用 ReadLines.ToArray 制作,但我认为额外的几行代码比包装的 IEnumerable 更好,因为它需要一些处理时间)

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2021-06-14
        • 2018-01-22
        相关资源
        最近更新 更多