2015-03-03 4 views
2

Я довольно новичок в регулярных выражениях, и я столкнулся с проблемой. У меня есть следующие данные в середине строки с большим количеством символов новой строки:Получение всех строк между двумя строками в отдельных группах

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 строк данных, которые я хотел бы получить в отдельных группах, если это возможно. Содержимое в строках данных не соответствует определенному шаблону.

ответ

1

Используйте ниже регулярных выражений, а затем принести три отдельные строки из индекса группы 1.

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

DEMO

0

Я думаю, что вы можете использовать Capture Коллекции класса.
Просто матч с этим, то перебрать группа 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' 
Смежные вопросы