Regex récupérer valeur à partir d'un caractère - Divers - Programmation
Marsh Posté le 24-03-2022 à 12:15:26
Bonjour,
La première chose à faire c'est de parser tes données pour te retrouver avec des champs bien distincts. Selon le langage utilisé tu auras des méthodes plus ou moins appropriées.
C'est qu'une fois que tu auras des champs séparés que tu pourras à commencer à vérifier leur contenu avec une regex. Le fait d'obtenir un "float" n'appartient qu'à toi, tu pars d'une représentation de tes données pour créer des données. Donc lorsque tu crées tes données tu peux bien choisir de créer des "float" ou non...
Les regex ça peut être puissant mais ce n'est pas une fin en soi, tu peux très bien faire sans. Soit en étant malin lors de la création des données soit avec les autres méthodes de travail sur les chaînes de caractères que propose ton langage.
Difficile d'aider plus sans connaitre le langage utilisé.
Bon courage !
Marsh Posté le 24-03-2022 à 17:44:52
Si t'es en PHP, tu peux faire un explode() sur le caractère ",". Ensuite, tu fais une regexp pour vérifier que les données dans les indices 4 et 5 (le tableau commence à 0) sont des floats.
Marsh Posté le 25-03-2022 à 08:32:49
Dans la plupart des langages tu as une fonction genre Split pour découper ta chaîne en un tableau sur chaque virgule.
Dont les regex d'ailleurs mais là ça n'a d'intérêt que pour les caractères changeants (par exemple "split à chaque fois que tu rencontres un chiffre" )
Mais si tu veux vraiment une regex tu peux faire un truc du genre :
^(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*),(-?\d*\.?\d*)$ |
https://regex101.com/r/jaWfA2/1
C'est moche et naïf mais ça marche. Tu peux aussi nommer tes groupes pour faciliter les utilisations ultérieures selon ton langage.
Ou en version avec des groupes répétés :
^(?:(-?\d*\.?\d*),?)+$ |
J'ai supposé qu'il pouvait y avoir des négatifs et des décimaux à chaque rang.
Marsh Posté le 25-03-2022 à 14:11:35
Merci pour toutes vos réponses,
C'est vrai qu'il manquait plusieurs informations, je m'explique :
Je ferai tout cela en C.
Je vous ai donné l'exemple pour une trame, mais faut se dire que j'aurais plusieurs trame, une différente par type de produit que j'ai, et dans le cas où un nouveau type arrive il faudrait que j'ai juste à rajouter un regex afin que ce soit plus simple plutot que de changer tous le code, c'est pour cela que le regex est imposé dans mon entreprise.
Je cherche donc à avoir un regex par type de produit, cela me permettra, lors de la récéption de ma trame, de passer les regex un a un afin de trouver quel est le type de produit qui m'a envoyé cette trame.
Les trames, se ressembles plus où moins, c'est pourquoi par exemple dans ce cas là, c'est la seule trame qui peut avoir des "float" ou bien pas de valeurs dans ces champs, les autres auront forcément un entier.
De ce que je comprends dans ce que vous m'expliquez, il est conseillé de split dans un premier temps la trame dans un tableau ? Mais ensuite comme passer un regex sur un tableau ? Parce que au final ce que je voulais obtenir c'était un regex, qui me permettait d'obtenir le type de produit en fonction de la trame (dans ce cas là en regardant les champs 5 et 6)
Merci d'avance.
Marsh Posté le 25-03-2022 à 16:42:56
En C? Tu vas t'amuser.
Regarde PCRE si tu veux absolument du Regex et strtok() (string.h je crois).
Marsh Posté le 25-03-2022 à 16:50:50
Purée, faire ça C. C'est une punition ou t'as perdu un pari
Franchement du PHP, PERL ou Python serait bien plus adapté pour traiter du texte. T'as quel volume à traiter à chaque fois ?
Si tes trames diffèrent par rapport au nb de champs, tu fais un explode() puis tu comptes la taille de ton tableau résultat. Un petit switch() en fonction de la taille puis un regexp pour vérifier les paramètres. Bref, en qq lignes de code, c'est fait.
Si le fichier n'est pas trop gros, tu peux faire un file() pour lire le fichier : t'as en sortie un tableau, une entrée dans le tableau par ligne dans le fichier.
Marsh Posté le 25-03-2022 à 21:11:18
zapsalis a écrit : Bonjour à toutes et tous, |
Donc tu as au moins 6 champs séparés par des virgules
^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*(,.*)?$ chaque champ est représenté par [^,]*
Et tu veux des floats ou rien dans les champs 5 et 6 ? donc pour un float -?[0-9]+\.[0-9]+ (a moduler selon que .2 ou 2. sont des valeurs acceptables dans ton modèle)
pour un float ou rien : (-?[0-9]+\.[0-9]+)?
Tu reportes dans ta regexp :
^[^,]*,[^,]*,[^,]*,[^,]*,(-?[0-9]+\.[0-9]+)?,(-?[0-9]+\.[0-9]+)?(,.*)?$
ou encore
^[^,]*,[^,]*,[^,]*,[^,]*,(-?\d+\.\d+)?,(-?\d+\.\d+)?(,.*)?$
Voilou.
A partir de la, tu dois facilement pouvoir écrire une fonction qui prend une représentation simple en entrée (dans ton cas, 5f6f par exemple) et génère la regexp correspondante en sortie.
A+,
Marsh Posté le 28-03-2022 à 10:17:38
Merci à tous pour vos réponses,
Pour expliquer un peu plus mon projet afin que vous compreniez mieux mon besoin.
Je créé un serveur de test sur lequel des produits de mon entreprise vont se connecter, à la suite de cette connexion une trame est envoyé par le produit à mon serveur (exemple d'une trame que je vous ai envoyé dans le premier message pour un produit X), grâce à cette trame je peux trouver le type de produit qui s'est connecté, dans ce cas la c'est grâce aux champs 5 et 6 car c'est la seule trame avec ces caractéristiques la.
Cependant, j'ai plusieurs type de produits (disons 5 ou 6), il me faut donc un regex pour chaque trame différente afin de savoir quel produit s'est connecté.
J'ai donc besoin, pour ce cas là, d'un regex qui va regarder si dans les champs 5 et 6 nous sommes bien en présence d'un float ou bien de rien (sinon je passerai au regex suivant, jusqu'à trouver le type de mon produit).
@Gilou merci de ta réponse, le regex que tu m'as fourni fonctionne à priori bien lorsque j'e met le champ vide, le regex trouve une correspondance, lorsque j'enlève le float par contre la ça ne trouve plus de correspondance, c'est donc bien ce qu'il me fallait.
Je vais donc continuer de le tester de mon côté pour être sur qu'il n'y a pas de problème.
Pour autant, je n'ai pas compris pourquoi tu me parlais d'une fonction qui génère le regexp ? Etant donné que j'ai ce regex il me renverra TRUE ou FALSE et voilà ?
Merci beaucoup.
Zapsalis
Marsh Posté le 30-03-2022 à 12:16:11
Tu avais l'air de dire que tu avais d'autre types de trame similaires a détecter.
> il me faut donc un regex pour chaque trame différente
Plutôt que de réécrire la regexp a chaque type de trame, autant avoir une fonction qui la génère.
A+,
Marsh Posté le 24-03-2022 à 11:17:12
Bonjour à toutes et tous,
Je suis nouveau ici, je viens vous demander votre aide pour créer un regex.
Je reçois une trame du style : 1234564798012345,10,250719,103018,47.211467,-0.060360,35.20,1,1.75,0,0,3531,27,0,0,108,53,10,10
Je souhaiterais récupérer ce qu'il y a dans le champ 5, c'est à dire "47.211467" et dans le champ 6 : "-0.060360" uniquement si ce sont des valeurs de type "float" ou bien dans le cas où le champ est vide.
Cependant je ne sais pas comment dire que je veux récupérer dans le champ 5 (donc après la 4ème virgule) et pareil pour le champ 6, je ne sais pas non plus comment vérifier le type (je pensais vérifier qu'il y a bien un "." présent cela confirmerait bien que c'est un "float" ), mais il faut aussi que je vérifie si ce n'est pas vide (donc 2 virgules à cet endroit et pas à un autre).
N'hésitez pas à me dire si vous n'avez pas compris ou autre.
Merci d'avance.
Cordialement.
Zapsalis