Bonjour,

je me heurte à une regex à écrire en Perl sur une ligne de log de téléchargement de fichier multimédia qui peut avoir ces 2 cas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
1.2.3.4 - 2018-11-03 00:06:35 GET /filename.mp3 queryparam 206 4870 - "AppleCoreMedia//1.0.0.16A404 (iPhone; U; CPU OS 12_0_1 like Mac OS X; fr_ca)" "1.2.3.4" 0.001 "bytes 0-65534/7254822"
1.2.3.4 - 2018-11-03 00:06:35 GET /filename.mp3 queryparam 200 4870 "http://lereferer.com" "AppleCoreMedia//1.0.0.16A404 (iPhone; U; CPU OS 12_0_1 like Mac OS X; fr_ca)" "1.2.3.4" 0.001 -
La 1ère ligne ne contient pas de champs referer et c'est donc un tiret qui est inscrit.
La 2nde ligne contient un referer mais ne contient pas la dernière valeur "bytes..." et c'est un tiret qui est inscrit.

Du coup, le Logger écrit un tiret lorsque la valeur est nulle et sinon encadre le champs par un double-guillemet.

Je me suis aidé du site https://regexr.com/ pour au final avoir ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
^(\S+) (\S+) (\S+) (\S+) (GET|POST) (.*?) (\S+) (\d+) (\d+) (\S+) (".*"|-) (\S+) (\S+) (\s+|-)
Mais cela ne matche pas cette condition qui dit "si le champs est un tiret ou alors qu'il est entouré par un double-guillemet" et je ne sais pas comment l'écrire.

Est-ce que vous pourriez m'aider svp ?

Merci.