代码之家  ›  专栏  ›  技术社区  ›  Austin Salonen gmlacrosse

正则表达式分组问题

  •  0
  • Austin Salonen gmlacrosse  · 技术社区  · 17 年前

    我有一些这种格式的文本数据:

    MI
    00
    3
    
    MD
    1
    0.0000
    MD
    2
    0.0000
    MD
    3
    0.0000
    

    此块可以重复,MDs的数量是可变的(但始终>=1),需要为每个MDs捕获以下数值。

    :每个请求。。。 正则表达式如下;我的问题的重要部分仍然是“我可以捕获每个MD集吗?”

    MI\r\d\d\r(\d)\r[\s\w]{6}\r(MD\r[\s\d]{2}\r[\s\d\.\-]*\r)+
    

    MD是90年代早期硫探测器的数据点。

    5 回复  |  直到 17 年前
        1
  •  3
  •   Andomar    17 年前

    每场比赛都有一组集合。在您的情况下,匹配[0]。组[1]将匹配MD记录,如“MD\n1\n0.0000MD\n2\n0.0000MD\n3\n0.0000”。

    每个小组都有一个小组 Captures collection ,您可以对其进行迭代以查找所有MD实例。这将为每个MD提供一个字符串,因此匹配[0]。组[1]。捕获[0]将为“MD\n1\n0.0000”。

    编辑:虽然您已经接受了答案,但这里有一种方法可以一次性解析所有内容:

    string pat = @"MI[\r\n]*(?<MI1>\d\d)[\r\n]*(?<MI2>\d+)[\r\n]*" +
        @"(MD[\r\n]*(?<MD1>\d+)*[\r\n]*(?<MD2>[\d\.\-]+)+[\r\n]*)*";
    
    var r = new Regex(pat);
    foreach (Match match in r.Matches(text))
    {
        Console.WriteLine("MI v1:{0} v2:{1}", 
             match.Groups["MI1"], match.Groups["MI2"]);
    
        if (match.Groups.Count > 2)
            for (var i = 0; i < match.Groups["MD1"].Captures.Count; i++)
                Console.WriteLine("  MD v1:{0} v2:{1}", 
                    match.Groups["MD1"].Captures[i], 
                    match.Groups["MD2"].Captures[i]);
    }
    

    MI
    00
    3
    
    MD
    1
    0.1000
    MD
    2
    0.2000
    MD
    3
    0.3000
    
    MI
    12
    5
    
    MI
    24
    5
    
    MD
    1
    0.1000
    

    输出为:

    MI v1:00 v2:3
      MD v1:1 v2:0.1000
      MD v1:2 v2:0.2000
      MD v1:3 v2:0.3000
    MI v1:12 v2:5
    MI v1:24 v2:5
      MD v1:1 v2:0.1000
    
        2
  •  2
  •   Brian    17 年前

    一种解决方案是嵌套的正则表达式调用,第一种方法查找每个MI组,第二种方法查找MI组中的每个MD组。

        3
  •  0
  •   Adam Crume    17 年前

    我不是C#方面的专家,但在Java中,您可能希望将(MD..+)更改为((MD..+)。这样,您就可以使用外圆括号对捕获所有MDs。

        4
  •  0
  •   duckyflip    17 年前

    state machine 为了完成这项任务。。

    但我认为这里有一个正则表达式也会起作用:

    MI\r\d\d\r(\d)\r\r(MD\r\d\r[0-9\.]+\r?)*
    
        5
  •  0
  •   Keng    17 年前

    MD[^MI]*
    

    编辑: 这似乎将所有MD和初始MI捕获到它自己的小块中。

    MI([^MI]*(MD[^MI]*)*)