C # |Regex |Как улучшить мои регулярные выражения - PullRequest
1 голос
/ 09 апреля 2019

У меня есть файлы журналов, и я хочу проанализировать эти журналы с помощью регулярного выражения - это сравнение строк по одному, если выполняются условия регулярного выражения.

Строка, которую я пытаюсь проанализировать:

190326 000117.252|0|0|1221564|21|Beg|Request: http://myurl/services/serviceName [CallId=85aa2407-8ca0-481c-9ece-a772ca789ce0]

Какую информацию я хочу получить:

  • threadId = 21 - до | Beg |Statement
  • callID = 85aa2407-8ca0-481c-9ece-a772ca789ce0 - значение callId в конце

Первое созданное мной регулярное выражениевыглядит так:

(?<thread>\d{2}).*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]

И выполнение заняло ~ 30-35 секунд.

Второе регулярное выражение, которое я использовал, выглядит так:

(?<thread>\d{2})[^|]*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]

ИВремя восстановления уменьшилось до ~ 9 секунд.

Не могли бы вы взглянуть на мое регулярное выражение и сообщить мне, если есть возможность улучшить регулярное выражение, чтобы улучшить время выполнения?

Заранее спасибо,Дэйв.

1 Ответ

1 голос
/ 09 апреля 2019

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

Для идентификатора потока:

(\d{2})[^|]*\|Beg

Получить группу 1.

Для идентификатора вызова:

CallId=([a-zA-Z0-9\-]+)

Получить группу 1.

На regex101.com ваше регулярное выражение выполнило 269 шагов, тогда как эти два регулярных выражения заняли 141 и 11шаги соответственно.

Если вы застряли только с одним регулярным выражением, вы можете попробовать сделать последнюю + жадную:

(?<thread>\d{2})[^|]*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+)\]

Это уменьшило количество шагов с 269 до 199.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...