C# 正在修复RegEx Split()函数-空字符串作为第一项

C# 正在修复RegEx Split()函数-空字符串作为第一项,c#,.net,regex,split,C#,.net,Regex,Split,预先编写代码,将我面临的问题形象化一点: 这是需要拆分的文本 这是我的正则表达式 Regex r = new Regex(@"\:\d{2}\w*\:", RegexOptions.Multiline); MatchCollection matches = r.Matches(Content); string[] items = r.Split(Content); // ----- Fix for first entry being empty string. int index

预先编写代码,将我面临的问题形象化一点:

  • 这是需要拆分的文本
  • 这是我的正则表达式

     Regex r = new Regex(@"\:\d{2}\w*\:", RegexOptions.Multiline);
    
     MatchCollection matches = r.Matches(Content);
     string[] items = r.Split(Content);
    
     // ----- Fix for first entry being empty string.
     int index = items[0] == string.Empty ? 1 : 0;
    
     foreach (Match match in matches)
     {
        MessageField field = new MessageField();
    
        field.FieldIdExtended = match.Value;
        field.Content = items[index];
    
        Fields.Add(field);
    
        index++;
     }
    
    从注释中可以看到,字符串的拆分出现了问题。 它返回一个空字符串作为第一项。 有什么优雅的方法可以解决这个问题吗

    谢谢,Dimi使用:

    string[] items = r.Split(Content, StringSplitOptions.RemoveEmptyEntries);
    

    删除空条目。

    之所以出现此行为,是因为拆分中的第一个分隔符之前没有任何内容,并且第一个条目为空

    正确解决这个问题的方法可能是捕获正则表达式中所需的值,然后从匹配集中获取它

    粗略地一猜,你可能想要这样的东西:

    Regex r = new Regex(@"^:(?<id>\d{2}\w*):(?<content>.*)$", RegexOptions.Multiline);
    
    MatchCollection matches = r.Matches(Content);
    
    foreach (Match match in matches)
    {
        MessageField field = new MessageField();
    
        field.FieldIdExtended = match.Groups["id"].ToString()
        field.Content = match.Groups["content"].ToString();
    
        Fields.Add(field);
    
    }
    
    Regex r=newregex(@“^:(?\d{2}\w*):(?*)$”,RegexOptions.Multiline);
    MatchCollection matches=r.matches(内容);
    foreach(匹配中的匹配)
    {
    MessageField=newmessagefield();
    field.FieldIdExtended=match.Groups[“id”].ToString()
    field.Content=match.Groups[“Content”].ToString();
    字段。添加(字段);
    }
    
    使用命名的捕获组可以很容易地提取内容。您可能需要调整正则表达式,使其更符合您的需要。目前,它将
    20
    作为id,将
    0444453880181732
    作为内容。我不是100%清楚您需要捕获什么,但是您使用正则表达式看起来还不错,所以我认为这不是问题。:)


    本质上,这里你不是真的试图拆分东西,而是匹配东西并将其拉出。

    +1很好,我正要发布类似的东西。有两件事:(1)您的最后一组应该引用“内容”而不是“测试”;(2)不需要转义
    (OP也这样做),(3)您应该能够在正则表达式的末尾去掉
    \n
    ;如果有任何问题,请在开始和结束时分别使用
    ^
    $
    。(4) 我更喜欢
    .Value
    而不是
    .ToString()
    @ahmaged:谢谢。1是因为我意识到,当我把代码粘贴到问题中时,我不应该称之为测试,而忘记了到处更新。2我在阅读问题时注意到了,但随后C&Ped了他的正则表达式并对其进行了修改,忘记删除转义。3是一个很好的点,我现在用^和$将它改为锚定在行的开头和结尾。感谢您的反馈。:)对代码的单个更正:(?*)应该是(?。\w*),因此我有正确的内容:)其余的都很好&因此被接受,非常感谢!!!修复不需要的空字符串的另一种方法是使用一点LINQ:
    string[]items=r.Split(Content).Where(s=>!string.IsEmpty(s)).ToArray()
    。如果正则表达式很难得到正确的结果,那么这可能会更简单(因此更容易维护),而不是针对单个(匹配开始)特殊情况调整正则表达式。这里的问题是在匹配的同时获得匹配表达式,如果只是关于拆分,那么当然你是对的,还有更多的选项可供选择。。。
    Regex r = new Regex(@"^:(?<id>\d{2}\w*):(?<content>.*)$", RegexOptions.Multiline);
    
    MatchCollection matches = r.Matches(Content);
    
    foreach (Match match in matches)
    {
        MessageField field = new MessageField();
    
        field.FieldIdExtended = match.Groups["id"].ToString()
        field.Content = match.Groups["content"].ToString();
    
        Fields.Add(field);
    
    }