获取两行之间的所有行在不同的组中

时间:2015-03-03 16:40:51

标签: .net regex

我对正则表达式很新,我遇到了一个问题。我在包含许多换行符的字符串中间有以下数据:

Data I dont care about
Start row
First data row
Second data row
Third data row
End row
More data I dont care about

我需要编写一个正则表达式,它将创建三个包含数据行的组。我试过写

(?<=Start row\n)(.|\n)+?(?=End row)    

但这只给了我一个包含所有三个数据行的组,而不是三组,每组包含一行。如果可能的话,也可能存在4或5个数据行,我想在不同的组中获取。数据行中的内容不遵循特定模式。

2 个答案:

答案 0 :(得分:1)

使用以下正则表达式,然后从组索引1中获取三个单独的行。

@"(?s)(?:(?<=Start row\n)|(?<!^)\G)\n?([^\n]+)(?=.*?End row)"

DEMO

答案 1 :(得分:0)

我认为你可以使用 Capture Collections 类 只需与此匹配,然后迭代第1组。

@"Start[ ]row\r?\n(?:([^\r\n]*)\r?\n)+?End[ ]row"

 Start [ ] row
 \r? \n 
 (?:
      ( [^\r\n]* )                  # (1)
      \r? \n 
 )+?
 End [ ] row

C#代码:

string strSrc =
    "Data I dont care about\n" +
    "Start row\n" +
    "First data row\n" +
    "Second data row\n" +
    "Third data row\n" +
    "End row\n" +
    "More data I dont care about\n" +
    "End row\n";

Regex rx = new Regex(@"Start[ ]row\r?\n(?:([^\r\n]*)\r?\n)+?End[ ]row");
Match srcMatch = rx.Match(strSrc);
if (srcMatch.Success)
{
    CaptureCollection cc = srcMatch.Groups[1].Captures;
    for (int i = 0; i < cc.Count; i++)
        Console.WriteLine("{0} = '{1}'", i, cc[i].Value);
}

输出:

0 = 'First data row'
1 = 'Second data row'
2 = 'Third data row'