Comment puis-je créer une regex pour une chaîne de caractères telle que celle-ci :
<SERVER> <SERVERKEY> <COMMAND> <FOLDERPATH> <RETENTION> <TRANSFERMODE> <OUTPUTPATH> <LOGTO> <OPTIONAL-MAXSIZE> <OPTIONAL-OFFSET>
La plupart de ces champs sont de simples mots, mais certains d'entre eux peuvent être des chemins, tels que FOLDERPATH, OUTPUTPATH, ces chemins peuvent également être des chemins avec un nom de fichier et un caractère générique ajoutés.
La rétention est un nombre, et le mode de transfert peut être bin ou ascii. La question est LOGTO qui peut être un chemin avec le nom du fichier journal en annexe ou peut être NO, ce qui signifie pas de fichier journal.
Le problème principal, ce sont les arguments facultatifs, ce sont tous deux des nombres, et OFFSET ne peut pas exister sans MAXSIZE, mais MAXSIZE peut exister sans offset.
Voici quelques exemples :
loveserver love copy /muffin* 20 bin C:\Puppies\ NO 256 300
loveserver love copy /muffin* 20 bin C:\Puppies\ NO 256
loveserver love copy /hats* 300 ascii C:\Puppies\no\ C:\log\love.log 256
Le problème principal est que les chemins peuvent contenir des espaces, donc si j'utilise . pour tout faire correspondre, la regex finit par se casser, lors de l'analyse des arguments optionnels où la destination LOG finit par être attachée au chemin de sortie.
De plus, si je finis par utiliser . et que je commence à en retirer des parties, la regex commencera à mettre des choses là où elle ne devrait pas.
Voici ma combinaison :
^(\s+)?(?P<SRCHOST>.+)(\s+)(?P<SRCKEY>.+)(\s+)(?P<COMMAND>COPY)(\s+)(?P<SRCDIR>.+)(\s+)(?P<RETENTION>\d+)(\s+)(?P<TRANSFER_MODE>BIN|ASC|BINARY|ASCII)(\s+)(?P<DSTDIR>.+)(\s+)(?P<LOGFILE>.+)(\s+)?(?P<SIZE>\d+)?(\s+)?(?P<OFFSET>\d+)?$