Шаблон разбиения для вашего случая может выглядеть так:
(?=\DT\d{10}\D)
Пример кода :
using System;
using System.Text.RegularExpressions;
class Test
{
static void Main(string[] args)
{
String sourcestring = @"sdfso dadfjlsdfjksdjfkjsd
sdfso dadfjlsdfjksdjfkjsd
T1234567898dssdkfjskfjksdj
T1234567890dssdkfjskfjksdj
sdfso dadfjlsdfjksdjfkjsd
T1234567891dssdkfjskfjksdj";
String matchpattern = @"(?=\DT\d{10}\D)";
Regex re = new Regex(matchpattern);
String[] splitarray = re.Split(sourcestring);
for(int sIdx = 0; sIdx < splitarray.Length; sIdx++ ) {
Console.WriteLine("[{0}] = {1}", sIdx, splitarray[sIdx].Trim());
}
}
}
В зависимости от вашего контекста вам, вероятно, все еще лучше читать построчно большой файл и собирать отдельные отчеты / блоки в Списке или тому подобное, как это было предложено Wiktor. Вы также можете продолжить обработку отчетов / блоков параллельно. Я предлагаю использовать классы StreamReader и StringBuilder.
Пример реализации
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string pattern = @"^T\d{10}\D";
var re = new Regex(pattern);
var result = new List<string>();
var block = new StringBuilder();
var fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Read);
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
if (re.IsMatch(line))
{
//store current block or hand it off to different process, etc.
result.Add(block.ToString());
block.Clear();
}
block.AppendLine(line);
}
// final block
result.Add(block.ToString());
}
}
}