Поскольку входная строка не совсем splittable , поскольку разделитель char также является частью содержимого, вместо него можно использовать простое выражение регулярного выражения.
Простое, но, вероятно, достаточно быстрое, даже снастройки по умолчанию.
Различные части входной строки можно разделить с помощью этих групп захвата:
string pattern = @"^(.*?)\|(.*?):\[(.*?)\]:(.*?):(.*?):(\d+):(.*?):\[(.*)\]$";
Это даст вам 8 групп + 1 (Group[0]
), которая содержит всю строку.
Используя класс Regex , просто передайте строку для анализа (с именем line
, здесь) и регулярное выражение (с именем pattern
) в Match () метод, используя настройки по умолчанию:
var result = Regex.Match(line, pattern);
Свойство Groups.Value возвращает результат каждой группы захвата.Например, две даты:
var dateEnd = DateTime.ParseExact(result.Groups[1].Value, "yyyy-MM-dd hh:mm:ss:ttt", CultureInfo.InvariantCulture),
var dateStart = DateTime.ParseExact(result.Groups[2].Value, "yyyy-MM-dd hh:mm:ss:ttt", CultureInfo.InvariantCulture),
IpAddress
извлекается с помощью: \[(.*?)\]
.
Вы можете дать имя этой группе, чтобы было более понятно, к какому значению относится.Просто добавьте строку с префиксом ?
и заключенную в <>
или в одинарные кавычки '
, чтобы назвать группу:
...\[(?<IpAddress>.*?)\]...
Обратите внимание, однако, что присвоение имени группе изменит Regex.Groups
индексация: вначале будут вставлены неназванные группы, затем именованные группы.Таким образом, присвоение имени только группе IpAddress
сделает ее последним элементом Groups[8]
.Конечно, вы можете назвать все группы, и индексирование будет сохранено.
var hostAddress = IPAddress.Parse(result.Groups["IpAddress"].Value);
Этот шаблон должен позволять машине medium анализировать 130,000~150,000
строк в секунду.
Вам придется проверить его, чтобы найти perfect шаблон.Например, первое совпадение (соответствующее первому свиданию): (.*?)\|
, намного быстрее, если не жадное (с использованием ленивого квантификатора).Противоположность последнего матча: \[(.*)\]
.Шаблон, используемый jdweng , даже быстрее, чем используемый здесь.
См. Regex101 для подробного описания использования и значения каждого токена.