Вас беспокоит несоответствие между файлами (т. Е. Из Unix / Mac против Windows) или внутри файлов?
Одна очень простая оптимизация, если вы знаете, что отдельные файлы соответствуют самим , состоит в том, чтобы читать только первую строку за символом и выяснять, что такое разделитель. Тогда определение точного положения любой другой линии будет простой математикой.
Если это не удастся, я думаю, что пойду за символом. Регулярное выражение кажется слишком «умным». Это звучит как сложная функция, и я думаю, что самая важная вещь будет состоять в том, чтобы облегчить ее написание, чтение, понимание и, что самое важное, отладку.
Есть еще один способ сделать это, который был бы более эффективным, если бы вашим источником данных был поток. К сожалению, это не так, как указано в вашем комментарии, поэтому вам придется сначала создать его; тем не менее, я все равно включу решение, оно может вдохновить вас:
public IEnumerable<int> GetLineStartIndices(string s)
{
yield return 0;
byte[] chars = Encoding.UTF8.GetBytes(s);
using (MemoryStream stream = new MemoryStream(chars))
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
while (reader.ReadLine() != null)
{
yield return stream.Position;
}
}
}
}
Это вернет вам начальную позицию каждой новой строки. Очевидно, что вы можете настроить это, чтобы сделать все, что вам нужно, то есть сделать что-то еще с реальными строками, которые вы прочитали.
Просто обратите внимание, что для создания байтового массива необходимо создать копию строки, поэтому она действительно не подходит для очень больших строк. Это немного лучше, чем подход char-by-char, но менее подвержен ошибкам, поэтому, возможно, стоит подумать, если длина строк не в мегабайтах.