Первое выражение соответствует началу строки, второе соответствует концу, вы можете объединить их, поместив между ними не жадный .*?
, например:
(?P<date>.*)\s+(?P<timezone>.*)\|.*\|.*\|(?P<ip>[\w*.:-]+)\|.*\|.*?(?P<path>[^\/]+(?=\-[^\/-]*$))
Как вы можете смотрите здесь это выражение работает, но для совпадения строки требуется 1660 шагов. Это связано с тем, что .*
между |
сначала захватывает всю строку до конца, а затем пытается отступить символ за символом, чтобы найти совпадение.
Если вы используете здесь не жадные модификаторы: .*?
, то машина регулярных выражений сначала будет сопоставлять пустую строку, а затем будет вынуждена перемещаться вперед символ за символом, пока не найдет соответствующий |
. Это уменьшит количество шагов до 1183: demo
Однако, если вы вообще хотите убрать этот возврат (отслеживание вперед), вы можете очень быстро пропустить столько |
символов возможно с [^|]*
. Точно так же мы можем заменить другие .*
шаблоны в регулярном выражении. Полученное регулярное выражение находит совпадение всего за 47 шагов, более чем в 30 раз меньше, чем исходное регулярное выражение:
(?P<date>\S*)\s+(?P<timezone>[^|]*)\|[^|]*\|[^|]*\|(?P<ip>[\w*.:-]+)\|[^|]*\|(?:[^\/\n]*\/)*(?P<path>.*)-.*
Демо здесь .
Обновление 2020-03-09
Если вы хотите сохранить последний сл sh, вы можете использовать это регулярное выражение :
(?P<date>\S*)\s+(?P<timezone>[^|]*)\|[^|]*\|[^|]*\|(?P<ip>[\w*.:-]+)\|[^|]*\|.*?(?P<path>\/[^\/]*)-[^\/]*