Пытаясь объединить два Regex - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь объединить два рабочих шаблона регулярных выражений в один. Пожалуйста, дайте мне знать правильный синтаксис, и если это может быть лучше написано.

Pattern 1: (?P<date>.*)\s+(?P<timezone>.*)\|.*\|.*\|(?P<ip>[\w*.:-]+)\|.*\|
Pattern 2: (?P<path>[^\/]+(?=\-[^\/-]*$))

Пример строки:

06/Mar/2020:00:01:04 -0500|/TESTSTREAM|5766764|4.2.2.1|123290|path1/path2/x-fr-US.OPEN.1-Turtle-2020.30.04-64.mp3

1 Ответ

0 голосов
/ 08 марта 2020

Первое выражение соответствует началу строки, второе соответствует концу, вы можете объединить их, поместив между ними не жадный .*?, например:

(?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>\/[^\/]*)-[^\/]*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...