修复RegEx Split()函数 - 将空字符串作为第一个条目

时间:2012-08-23 14:01:24

标签: c# .net regex split

预先提供代码,以便将我面临的问题略微可视化:

  1. 这是需要拆分的文本。
  2. :20:0444453880181732
    :21:0444453880131350
    :22:CANCEL/ABCDEF0131835055
    :23:BUY/CALL/E/EUR
    :82A:ABCDEFZZ80A
    :87A:4444655604
    :30:061123
    :31G:070416/1000/USNY
    :31E:070418
    :26F:PRINCIPAL
    :32B:EUR1000000,00
    :36:1,31000000
    :33B:USD1310000,00
    :37K:PCT1,60000000
    :34P:061127USD16000,00
    :57A:ABCDEFZZ80A
    

    这是我的正则表达式

     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

2 个答案:

答案 0 :(得分:4)

您获得此行为的原因是您的拆分中的第一个分隔符在它之前没有任何内容,并且第一个条目为空。

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

粗略地猜测你可能想要的东西:

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);

}

使用命名捕获组可以轻松提取内容。您可能需要根据需要调整正则表达式。目前,它将20作为内容,0444453880181732作为内容。我不是100%清楚你需要捕获什么,但你看起来没有正则表达式,所以我认为这不是一个问题。 :)

基本上在这里,你并不是真的想要分割东西,而是匹配东西并把它拉出来。

答案 1 :(得分:-3)

使用:

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

删除空条目。