Необязательные поля при сопоставлении строк файла журнала с помощью регулярных выражений

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

У меня проблемы с сопоставлением строк журнала с пропущенными полями. В этом журнале есть два вида строк:

<134>2016-10-23T23:59:59Z cache-iad2134 fastly[502801]: 52.55.94.131 "-" "-" Sun, 23 Oct 2016 23:59:59 GMT GET /apps/events/2016/10/11/3062653/?REC_ID=3062653&id=0 200

<134>2016-10-23T23:59:59Z cache-dfw1835 fastly[502801]: 1477267199

Я написал следующее регулярное выражение, которое соответствует первому типу строки со всеми полями:

^(\\S+) (\\S+) (\\S+) (\\S+) "(\\S+)" "(\\S+)" (.*) (\\d{3})

Но я играл с ? чтобы заставить регулярное выражение опционально игнорировать поля после первых 4, но продолжал портить столбцы.

Любые предложения о том, как я должен добавить ? без изменения количества групп (чтобы десериализатор не откашлялся)? Или другой способ сделать это вы бы предложили?

1 ответ

Поместите группу без захвата вокруг всех полей после первых 4 и сделайте ее необязательной.

^(\\S+) (\\S+) (\\S+) (\\S+)(?: "(\\S+)" "(\\S+)" (.*) (\\d{3}))?

Ввод ?: в начале группы делает его не захватывающим. Таким образом, эта группа не влияет на количество групп, которые были захвачены.

Другие вопросы по тегам