2016-10-28 1 views
2

J'essaie d'analyser un journal Web avec des expressions régulières à l'aide de RegexSerDe. Il fonctionne en faisant correspondre chaque groupe regex avec une colonne dans une table et si le groupe regex est vide, il attribue une valeur nulle à cette colonne.Champs facultatifs lors de la correspondance des lignes de fichier journal à l'aide de regex

Je n'arrive pas à identifier les lignes de journal avec des champs manquants. Il existe deux types de lignes dans ce journal:

<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 

J'ai écrit le ci-dessous regex qui correspond au premier type de ligne avec tous les champs:

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

Mais j'ai joué avec ? pour obtenir le regex pour éventuellement ignorer les champs après les 4 premiers mais a continué à déconner les colonnes.

Des suggestions sur la façon dont je devrais ajouter le ? sans changer le nombre de groupes (de sorte que le désérialiseur ne crache pas)? Ou tout autre moyen de le faire, vous suggéreriez?

+0

Puisque vous n'avez pas montré l'expression rationnelle avec les modificateurs optionnels, comment pouvons-nous vous dire ce que vous avez mal fait? La seule chose que je peux penser est que vous avez oublié de rendre les espaces entre les champs facultatifs aussi. – Barmar

Répondre

1

Placez un groupe sans capture autour de tous les champs après les 4 premiers et rendez-le facultatif.

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

Mettre ?: au début d'un groupe rend non-capture. Ce groupe n'a donc aucune incidence sur le nombre de groupes capturés.

+0

Merci beaucoup Barmar. Cela a fonctionné comme un charme. J'apprécie vraiment votre aide. –