【问题标题】:Split string by line who start with specific value以特定值开头的行拆分字符串
【发布时间】:2019-08-02 21:00:04
【问题描述】:

我正在尝试将一个巨大的字符串分成不同的“部分”。这些部分由这一行 #========================================================= 分隔。问题是每个字符串都有不同的分隔符(==== 的数量不一样)

List<Section> sections = file.GetSections("#=========================================================");
List<Section> sections = file.GetSections("#=========================================");
public List<Section> GetSections(string separator)
{
    List<Section> sections = new List<Section>();
    string[] values = _fileContent.Split(separator);

    foreach (string value in values)
    {
        sections.Add(new Section(value));
    }

    return sections;
}

如您所见,我需要根据我正在使用的文件更改分隔符,因为所有分隔符都以#==== 开头。我想知道是否可以按“以#====开头的行”分割

【问题讨论】:

  • 我很确定 Regex 可以做到这一点。但我不能真正为你提供代码,因为我自己还没有完全理解正则表达式。但这听起来确实像它的本意。
  • 正则表达式可能是最简单的。然而,一个好的老式 for 循环和状态机也将超级容易和超级快。状态一,你在文本中,状态二你找到了一个哈希,状态三你在一堆等号中
  • 第一部分是否以分隔符开头?

标签: c# string list split


【解决方案1】:

Regex 是在这里使用的好工具。例如:

return Regex.Split(input, @"^#====[=]*\s*$", RegexOptions.Multiline)
    .Select(s => new Section(s));

在此示例中,正则表达式模式 (^#====[=]*\s*$) 匹配输入字符串的以下部分:

  1. 以换行符开头 (^)
  2. #==== 紧跟该换行符。
  3. 之后可能会有一些= 标志。
  4. 后面可能有一些空格(这很重要,因为那里经常会有不可见的\r 字符)。
  5. 以换行符结尾 ($)。

您可能需要根据您的一些特定要求对此进行调整。例如,@"^#====[=]*\s*(\r\n|\r|\n)? 可用于将换行符 (\n) 本身包含在模式中,以确保此额外字符不包含在每个部分的开头。或者您可能想要添加 .Select(s =&gt; s.Trim()) 以消除部分之间的所有额外空白。

【讨论】:

    【解决方案2】:

    这样的问题可以很容易地通过老式的 for 循环和状态机来解决。虽然为了便于使用,我把它放在了 Iterator 方法中:

    public static IEnumerable<string> GetStrings(string input)
    {
       var state = 0;
       var sb = new StringBuilder();
    
       foreach (var c in input)
       {
          if (state == 0 && c != '#')
             sb.Append(c);
          if (state == 0)
          {
             yield return sb.ToString();
             sb.Clear();
             state = 1;
          }
          if (state == 1) 
              state = 2;
          else if (c != '=') 
              state = 0;
       }
    
       yield return sb.ToString();
    }
    

    用法

    var input = "asdasda#===fgsdfsdfdg#====";
    
    foreach (var str in GetStrings(input))
        Console.WriteLine(str);
    

    我确实认为正则表达式更简洁;但是,这是校园里的东西,而且速度非常快。

    不过,简而言之,我会使用正则表达式,更少的代码更易于理解和维护。

    请注意,这将在 '#' 上作为字符串中的文本本身失败。您可以检查状态“1”。

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 2023-01-30
      • 2017-08-08
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多