2015-06-10 1 views
0

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

BotInfo[-]: Source IP:[10.1.1.100] Target Host:[CentOS70-1] Target OS:[CentOS 
7.0] Description:[HTTP Connection Request] Details:[10.1.1.101 - - [28/May 
/2013:12:24:08 +0000] "GET /math/html.mli HTTP/1.0" 404 3567 "-" "-" ] Phase: 
[Access] Service:[WEB] 

Цель состоит в том, чтобы иметь две группы захвата. Один для тега (например, исходный IP, целевой хост, описание и т. Д.) И другой для содержимого, содержащегося в крайних квадратных скобках.

Это «внешняя», которая меня достает, потому что содержимое тега Details содержит квадратные скобки.

Вот мой текущий прогресс в этом регулярном выражении. Я использую/г флаг:

\s?([^:]+):\[(.*?(?=\]\s.*?:\[))\] 

Это обрабатывает все, кроме кромки корпуса (это сложнее, чем это необходимо, потому что я возился с попыткой получить случай края для работы).

Мой текущий взгляд (\]\s.*?:\[), на высоком уровне, соответствует левому скобку конца, а затем следующему тегу. Другая проблема заключается в том, что это не удается в последнем матче, потому что не существует следующего тега.


Редактировать: Был запрошен пример успешного вывода. Используя данные, при условии, цель состоит в том, чтобы иметь две группы захвата в результате в этих парах:

MATCH 1 
1. `Source IP` 
2. `10.1.1.100` 
MATCH 2 
1. `Target Host` 
2. `CentOS70-1` 
MATCH 3 
1. `Target OS` 
2. `CentOS 7.0` 
MATCH 4 
1. `Description` 
2. `HTTP Connection Request` 
MATCH 5 
1. `Details` 
2. `10.1.1.101 - - [28/May/2013:12:24:08 +0000] "GET /math/html.mli HTTP/1.0" 404 3567 "-" "-" ` 
MATCH 6 
1. `Phase` 
2. `Access` 
MATCH 7 
1. `Service` 
2. `WEB` 
+0

Можете ли вы дать ожидаемый результат для образца части вашей строки?например, для 'Подробности: [10.1.1.101 - - [28/май/2013: 12: 24: 08 +0000]" GET /math/html.mli HTTP/1.0 "404 3567" - "" - "]' – Kasramvd

+0

@ Тенсибай, да, мои извинения, я имею в виду поле Details:. Я отредактирую это. – Joshua

ответ

5

Сильно вдохновлен this answer о вложенных шаблонах я в конечном итоге с этим регулярным выражением с Demo here:

\s*([\w ]+):\s*(\[((?>[^[\]]+|(?2))*)\]) 

Главными Идея состоит в том, чтобы как можно больше повторить совпадение скобок (если найдена открывающая или закрывающая скобка, повторите с (? 2). Данные, которые вы ищете, действительно находятся в первой и третьей группе захвата, вторая - захват с помощью скобок для рекурсии, чтобы произойти должным образом.

Подробная информация о регулярных выражениях:

  • \s* матч (и отбрасывают) все пробелы до поля
  • ([\w ]+): Захват имя поля (все до :)
  • \s* Снова отбрасывать любое пространство перед полем
  • (\[ Начало второй группы захвата и соответствовать litteral [
  • ((?>[^[\]]+ Начало третьего гр захвата ппа с атомным матчем (блокирование возвратов, чтобы избежать бесконечного цикла), которое должно соответствовать что-нибудь, но скобки
  • |(?2)) Если мы нашли кронштейн, попробуйте повторного сопоставление всей второй группе
  • *) повтор 0 или бесконечного число раз атомной группы с чередованием получить вложенные скобки и закончить третью группу захвата
  • \]) наш последний кронштейн для согласования и завершения второй группы захвата, используемой в чередовании для атомного совпадения.
+0

Спасибо, это именно то, что я искал! У меня не было большого опыта с атомными захватами за пределами чтения о них. Повторная передача второй группы захвата была умной. Спасибо, миллион. – Joshua