Extraire le dernier élément de chaque ligne en regex

Extraire le dernier élément de chaque ligne

Bonjour à tous, aujourd’hui un petit TP sur les expressions régulières. J’ai un collègue qui m’a demandé comment on pouvait Extraire le dernier élément de chaque ligne dans un bout de texte de quelques centaines de lignes. Voici un exemple de format :

IP Address 595,537
IPv6 Address 1,443
MAC Address 0
MD5 163,573

La première version de la regex que j’ai proposée est simple au possible :

([^\s]+)$

Qui signifie en gros : « tout, sauf les espaces avant la fin de chaque ligne ». Cette expression a quand même un problème avec ses performances (326 steps sur regex101) dans la mesure le moteur d’évaluation avance dans le texte, il ne part pas de la fin et va donc avancer dans chaque mot avant de « backtracker », si celui ci n’est pas suivi de la fin de ligne.

Du coup, j’ai pu proposer une première version optimisée :

^.*?\s([^\s]+)$

C’est l’une des rares cas que j’ai croisé où l’usage d’un .* rends l’expression plus performante (120 steps sur le même texte) en l’obligeant à aller à la fin de ligne directement avant de matcher le dernier bloc. D’après regex101, on est donc déjà 3 fois plus performant que la précédente.

J’ai réussi à faire une dernière petite optimisation pour descendre encore un peu le nombre d’étape en spécifiant exactement ce qu’on attend en fin de ligne. En conséquence, cela ne fonctionne que parce que les fins de ligne sont forcément des numériques ou virgule dans mon cas (et qu’on en a pas ailleurs dans le texte de mon exemple). On peut le voir comme une manière détournée d’éviter le « .* ».

\s([\d|,]+)$

Et là on descend à 76 steps sur regex101, sur 66 caractères dans le texte, je suis assez content de moi :-D. Après j’ai pas réussi à faire mieux. Voilà, c’est tout ce que j’avais a vous montrer pour extraire le dernier élément de chaque ligne grâce aux expression régulière. J’espère que ça vous aura intéressé.

D’ici la prochaine. n’oubliez pas les regex c’est la vie donc : « Regexez » bien ; et @+

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.