Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1678 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Regex récupérer valeur à partir d'un caractère

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Regex récupérer valeur à partir d'un caractère

n°2413111
zapsalis
Posté le 24-03-2022 à 11:17:12  profilanswer
 

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

mood
Publicité
Posté le 24-03-2022 à 11:17:12  profilanswer
 

n°2413114
MaybeEijOr​Not
but someone at least
Posté le 24-03-2022 à 12:15:26  profilanswer
 

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 !


Message édité par MaybeEijOrNot le 24-03-2022 à 12:15:41

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2413155
rufo
Pas me confondre avec Lycos!
Posté le 24-03-2022 à 17:44:52  profilanswer
 

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.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2413202
TotalRecal​l
Posté le 25-03-2022 à 08:32:49  profilanswer
 

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.


Message édité par TotalRecall le 25-03-2022 à 08:33:13

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2413215
zapsalis
Posté le 25-03-2022 à 14:11:35  profilanswer
 

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.


Message édité par zapsalis le 25-03-2022 à 14:16:39
n°2413223
rat de com​bat
attention rongeur méchant!
Posté le 25-03-2022 à 16:42:56  profilanswer
 

En C? Tu vas t'amuser. :o
 
Regarde PCRE si tu veux absolument du Regex et strtok() (string.h je crois).

n°2413224
rufo
Pas me confondre avec Lycos!
Posté le 25-03-2022 à 16:50:50  profilanswer
 

Purée, faire ça C.  :sweat:  C'est une punition ou t'as perdu un pari  :whistle:  
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.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2413244
gilou
Modérateur
Modzilla
Posté le 25-03-2022 à 21:11:18  profilanswer
 

zapsalis a écrit :

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

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+,


Message édité par gilou le 26-03-2022 à 00:47:51

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2413285
zapsalis
Posté le 28-03-2022 à 10:17:38  profilanswer
 

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

n°2413588
gilou
Modérateur
Modzilla
Posté le 30-03-2022 à 12:16:11  profilanswer
 

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+,


Message édité par gilou le 30-03-2022 à 12:17:07

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Regex récupérer valeur à partir d'un caractère

 

Sujets relatifs
std::regex_replace[résolu] Typage fort et valeur null dans paramétre d'une méthode
Récupérer la valeur d'inputs pour personnaliser h1Astuce pour récupérer pdf ?
[Powershell]Ajouter une valeur dans un tableau dans requête reccursivecss valeur par défaut
[PYTHON] récupérer donnéesRegex commence par, finit par, et contient
Recherche caractère unicode 
Plus de sujets relatifs à : Regex récupérer valeur à partir d'un caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR