Необязательные поля при сопоставлении строк файла журнала с помощью регулярных выражений
Я пытаюсь проанализировать веб-журнал с регулярными выражениями, используя 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}))?
Ввод ?:
в начале группы делает его не захватывающим. Таким образом, эта группа не влияет на количество групп, которые были захвачены.