[REGEX] Recherche Patten de capture, un défi ?

Résolu
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 - 11 oct. 2023 à 20:43
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 - 27 févr. 2024 à 23:34

Bonjour à tous,

J'essaie vainement de créer un Patten de capture.

Voici la chaine concernée:

85339147802789523626847310205970239AR2950793415PC7098624031

De cette chaine, j'aimerais capturer les caractères qui sont après 10 jusqu'à AR.

Soit : 205970239

Les contraintes:

Après 85 il y a toujours 14 caractères variable.

Après 36 il y a toujours 6 caractères variable.

Le nombre de caractères entre 10 et AR et compris entre 1 et 20 caractères variable.

Après 29 il y a toujours 6 caractères variable.

Après 15 le nombre de caractères et compris entre 1 et 20 caractères variable.

85, 36, le couple 10 et AR, 29 et 15 serons toujours présent.

85 est toujours en début de chaine.

Les positions de 36, du couple 10 et AR, 29 et 15 peuvent changer

Dans ma chaine d'exemple nous avons:

85, 36, le couple 10 et AR, 29 et 15

Ça pourrait être:

85, 29, le couple 10 et AR, 15 et 36

Ou encore:

85, le couple 10 et AR, 15, 36, 29

J'espère être assez claire et que vous pourrez m'aider ?

142 réponses

NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
30 oct. 2023 à 21:30

Bonsoir Whismeril,

J'ai regardé pour corriger mon tableau des groupes de patterns, j'ai des doublons de groups au niveau du pattern.

Exemple: (\d{18})$ pour le groupe 1) balise 00 et le groupe 51) balises 8017 et 8018, mais le groupe 1) ne requière pas de balise de fin contrairement au groupe 51.

Dans ce cas nous ne devons pas le fusionner.

Je vais en priorité m'occuper de ça!

J'ai passé pas mal de temps à analyser ton code et étudier tes patterns regroupés.

Tu as appliqué "caracteresOK" a la balise 01, elle en a normalement pas besoin selon le tableau?

J'ai commencé a rédigé les patterns en commençant par le début du tableau.

Je me suis arrêté au groupe 6 vu que je dois reprendre les doublons du tableau avant!

Peux-tu me confirmer que je suis sur la bonne voie?

' Où X = Balises multiples

'Groupe [1]
'Balise: 00
'Pattern GS1: ^0(\d{18})$
"\(?(00)\)?(\d{18})" + gs, _

'Groupe [2]
'Balise: 01, 02
'Pattern GS1: ^X(\d{14})$
"\(?(0[12])\)?(\d{14})" + gs, _

'Groupe [3]
'Balise: 10, 21, 22
'Pattern GS1:  ^X([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,20})$
'caracteresOK = "[\x21-\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]"
'Pattern Modifier = ^X([\x21-\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]{0,20})$
"(\(?(2[12]|10)\)?" + caracteresOK + "{0,20})" + fnc1, _

'Le groupe 4 a été fusionné avec le groupe 13, je passe au groupe 5.

'Groupe [5]
'Balise: 20
'Pattern GS1: ^20(\d{2})$
"\(?(20)\)?(\d{2})" + gs, _

'Groupe [6]
'Balise: 235
'Pattern GS1: ^235([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,28})$
'caracteresOK = "[\x21-\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]"
'Pattern Modifier = ^235([\x21-\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]{0,28})$
"(\(?(235)\)?" + caracteresOK + "{0,28}?)" + fnc1, _

Je ne serais pas disponible demain et mercredi, mais je reviens jeudi ;)

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
30 oct. 2023 à 22:15

Tu m'avais dit que l'AI 01 pouvait être précédé de ]xx et là tu ne prends plus cela en compte.

Exemple: (\d{18})$ pour le groupe 1) balise 00 et le groupe 51) balises 8017 et 8018, mais le groupe 1) ne requière pas de balise de fin contrairement au groupe 51.

Je pense que tu peux fusionner parce que la donnée à un longueur fixe. En ajoutant le gs optionnel ça marchera dans un cas comme dans l'autre.

Tu as appliqué "caracteresOK" a la balise 01, elle en a normalement pas besoin selon le tableau?

Effectivement, on avait mis n'importe quel caractères, que j'ai changé par caracteresOK sans aller vérifier qu'en fait c'est des chiffres 

A part ça, tes premiers patterns me semblent corrects 

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1 > Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024
Modifié le 30 oct. 2023 à 23:01

Citation:

Tu m'avais dit que l'AI 01 pouvait être précèdé de ]xx et là tu ne prends plus cela en compte.

Réponse;

Oups! mea-culpa!

On garde bien ]xx qui précède l'AI 01

Merci d'avoir regardé mes patterns

Je continue avec le tableau ……

PS: comment fait tu tes citations?

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
31 oct. 2023 à 00:09

Cette fois ci le tableau des patterns est OK

Pour les patterns qui étaient identiques mais qui nécessitaient une balise de fin ou pas, je ne les ai pas fusionnés.

Ça faisait gagner que 2 groupes, j'ai préféré les garder séparé.

On passe de 54 à 48 groupes.

J'ai mis les caractères ok en bleu, il y en a 2 différents (1 en rouge l'autre en vert).

Si tu remarques quelque chose, n'hésite pas.

Groupe-Pattern-V2

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
31 oct. 2023 à 07:01
0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656 > Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024
31 oct. 2023 à 07:41

Concernant les caractères OK, déjà je m'interroge sur le fait de les avoir mis en hexa. Ce sont tous des caractères imprimables, mais soit.

Ensuite, celui que j'avais pris pour argent comptant (le bleu je pense), se réduit comme je l'ai fait (et encore, j'ai laissé un - inutile)

[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A] (bleu)

[\x21-\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A] (moi)

Je m'explique

  • de x21 à x22 (c'est les 2 qui se suivent, donc le tiret est en trop) => !"
  • de x25 à x2F, puis de x30 à x39, puis x3A à x3F, or 2F+1 = 30 et 39 + 1 = 3A => ce n'est qu'une suite et pas 3 de x25 à x3F => %-?
  • le reste est bon

Normalement ["!%-?A-Z_a-Z] donnera exactement le même résultat


[\x23\x2D\x2F\x30-\x39\x41-\x5A] (rouge)

 Celui semble optimisé et l'utlisation de l'hexa peut s'entendre, car il y a le - comme caractère autorisé, mais ceci devrait faire la même chose

[#\x2D/0-9A-Z]


Enfin, celui-ci se réduit aussi

[\x21-\x22\x25-\x2F\x30-\x39\x41-\x5A\x5F\x61-\x7A]

[\x21\x22\x25-\x39\x5F\x61-\x7A]

ou

[!"%-9_a-z]


Par contre, je n'ai pas vérifié la justesse de tes fusions et donc des patterns qui en découllent

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
2 nov. 2023 à 13:43

Bonjour Whismeril,


Je n'ai pas le droit au bouton de citation:


J'ai travaillé sur la dénomination des balises (AI)

00 : N° CONTENEUR (SSCC)
01 : N° ARTICLE (GTIN)
02 : N° ARTICLES CONTENUS
10 : N° LOT
11 : DATE PRODUCTION
12 : DATE ECHEANCE
13 : DATE EMBALLAGE
15 : DATE PREREMPTION
16 : DATE VENTE
17 : DATE EXPIRATION
20 : VARIANTE ARTICLE
21 : N° SÉRIE
22 : VARIANTE PRODUIT
235 : EXTANSION CONTROLE
240 : ID ADDITIONNEL
241 : N° PIECE
242 : N° VARATION
243 : N° EMBALAGE
250 : N° SÉRIE SECONDAIRE
251 : REF SOURCE
253 : IDENTIFICATEUR DOC (GDTI)
254 : COMPOSANT EXTENSION (GLN)
255 : N° COUPON (GCN)
30 : NB VARIABLE ARTICLES
3100-3105 : POIDS NET (kg)
3110-3115 : LONGUEUR (m)
3120-3125 : LARGEUR (m)
3130-3135 : HAUTEUR (m)
3140-3145 : SUPERFICIE (m²)
3150-3155 : VOLUME NET (l)
3160-3165 : VOLUME NET (m³)
3200-3205 : POIDS NET (lb)
3210-3215 : LONGUEUR (in)
3220-3225 : LONGUEUR (ft)
3230-3235 : LONGUEUR (yd)
3240-3245 : LARGEUR (in)
3250-3255 : LARGEUR (ft)
3260-3265 : LARGEUR (yd)
3270-3275 : HAUTEUR (in)
3280-3285 : HAUTEUR (ft)
3290-3295 : HAUTEUR (yd)
3300-3305 : POIDS BRUT (kg)
3310-3315 : LONGUEUR (m), logistique
3320-3325 : LARGEUR (m), grume
3330-3335 : HAUTEUR (m), grume
3340-3345 : SUPERFICIE (m²), logistique
3350-3355 : VOLUME (l), logistique
3360-3365 : VOLUME (m³), logistique
3370-3375 : KG PAR m²
3400-3405 : POIDS BRUT (lb)
3410-3415 : LONGUEUR (po), bille
3420-3425 : LONGUEUR (ft), bille
3430-3435 : LONGUEUR (yd), bille
3440-3445 : LARGEUR (po), grume
3450-3455 : LARGEUR (ft), grume
3460-3465 : LARGEUR (yd), grume
3470-3475 : HAUTEUR (po), grume
3480-3485 : HAUTEUR (ft), grume
3490-3495 : HAUTEUR (yd), grume
3500-3505 : SUPERFICIE (in²)
3510-3515 : SURFACE (pi²)
3520-3525 : SUPERFICIE (yd²)
3530-3535 : SUPERFICIE (in²), logistique
3540-3545 : SUPERFICIE (pi²), logistique
3550-3555 : SUPERFICIE (yd²), logistique
3560-3565 : POIDS NET (t oz)
3570-3575 : VOLUME NET (oz)
3600-3605 : VOLUME NET (qt)
3610-3615 : VOLUME NET (gal.)
3620-3625 : VOLUME (qt), logistique
3630-3635 : VOLUME (gal.), logistique
3640-3645 : VOLUME (po³)
3650-3655 : VOLUME (pi³)
3660-3665 : VOLUME (yd³)
3670-3675 : VOLUME (po³), bille
3680-3685 : VOLUME (pi³), rondin
3690-3695 : VOLUME (yd³), logistique
37 : COMPTAGE UNITÉ, logistique
3900-3909 : MONTANT
3910-3919 : MONTANT (ISO)
3920-3929 : PRIX
3930-3939 : PRIX (ISO)
3940-3943 : REMISE %
3950-3955 : PRIX / UoM
400 : NUMÉRO DE COMMANDE
401 : N° INDENTIFICATION (GINC)
402 : N° INDENTIFICATION (GSIN)
403 : CODE ROUTAGE
410 : EXPÉDIER À
411 : FACTURER À
412 : ACHAT AUPRÈS DE
413 : EXPÉDIER POUR
414 : N° LOC
415 : PAYER À
416 : PROD/SERV LOC
417 : PARTIE
420 : EXPÉDIER CODE POSTAL
421 : EXPÉDIER CODE POSTAL (ISO)
422 : ORIGINE
423 : PAYS - PROCESSUS INITIAL
424 : PAYS - PROCESSUS
425 : PAYS - DÉSASSEMBLAGE
426 : PAYS - PROCESSUS COMPLET
427 : SUBDIVISION ORIGINE
4300 : ENVOYER À SOCIÉTÉ
4301 : ENVOYER AU NOM
4302 : ENVOYER À ADD1
4303 : ENVOYER À ADD2
4304 : ENVOYER À BANLIEUE
4305 : ENVOYER À LOC
4306 : ENVOYER VERS REG
4307 : ENVOYER AU PAYS
4308 : ENVOYER AU TÉLÉPHONE
4309 : ENVOI VERS GEO
4310 : RETOUR À SOCIÉTÉ
4311 : RETOUR AU NOM
4312 : RETOUR À ADD1
4313 : RETOUR À ADD2
4314 : RETOUR EN BANLIEUE
4315 : RETOUR À LOC
4316 : RETOUR À REG
4317 : RETOUR AU PAYS
4318 : RETOUR CODE POSTAL
4319 : RETOUR AU TÉLÉPHONE
4320 : DESCRIPTION DU SERVICE
4321 : MARCHANDISES DANGEREUSES
4322 : AUTORISATION DE SORTIE
4323 : SIGNATURE REQUIS
4324 : PAS AVANT DATE
4325 : PAS APRES DATE
4326 : DATE DE SORTIE
7001 : N° STOCK OTAN (NSN)
7002 : DÉCOUPE DE VIANDE
7003 : DATE DE PÉREMPTION
7004 : PUISSANCE ACTIVE
7005 : ZONE DE CAPTURE
7006 : DATE DE LA PREMIERE CONGELATION
7007 : DATE DE RÉCOLTE
7008 : ESPÈCES AQUATIQUES
7009 : TYPE D'ENGIN DE PÊCHE
7010 : MÉTHODE DE PRODUCTION
7011 : DATE LIMITE D'ESSAI
7020 : RÉNOVATION LOT
7021 : STATUS FONCTIONNEL
7022 : STATUS RÉVISION
7023 : ID ASSEMBLAGE(GIAI)
7030 : PROCESSEUR ISO # 0
7031 : PROCESSEUR ISO # 1
7032 : PROCESSEUR ISO # 2
7033 : PROCESSEUR ISO # 3
7034 : PROCESSEUR ISO # 4
7035 : PROCESSEUR ISO # 5
7036 : PROCESSEUR ISO # 6
7037 : PROCESSEUR ISO # 7
7038 : PROCESSEUR ISO # 8
7039 : PROCESSEUR ISO # 9
7040 : UIC+EXT
710 : NHRN PZN
711 : NHRN CIP
712 : NHRN CN
713 : NHRN DRN
714 : NHRN AIM
715 : NHRN NDC
7230 : CERT # 1
7231 : CERT # 2
7232 : CERT # 3
7233 : CERT # 4
7234 : CERT # 5
7235 : CERT # 6
7236 : CERT # 7
7237 : CERT # 8
7238 : CERT # 9
7239 : CERT # 10
7240 : PROTOCOLE
7241 : TYPE DE SUPPORT AIDC
7242 : VCN
8001 : DIMENSIONS
8002 : CMT No.
8003 : GRAI
8004 : GIAI
8005 : PRIX PAR UNITÉ
8006 : ITIP
8007 : IBAN
8008 : HEURE PRODUCTION
8009 : OPTSEN
8010 : CPID
8011 : CPID SERIE
8012 : VERSION
8013 : GMN
8017 : GSRN - PRESTATAIRE
8018 : GSRN - DESTINATAIRE
8019 : SRIN
8020 : REF No.
8026 : CONTENU ITIP
8030 : DIGSIG
8110 : code coupon
8111 : POINTS
8112 : ID COUPON
8200 : URL DU PRODUIT
90 : INTERNE MUTUELLE
91-99 : INTERNE


Là je m'arrache les cheveux avec les patterns, plus exactement les parenthèses.

Je pense que mes patterns sont bon, mais rien ne fonctionne à cause de ces foutu parenthèses.

Pourrais-tu regarder ou je fais erreur?
 

' Où X = Balises multiples

'Groupe [1]
'Balise: 00
'Pattern GS1: ^0(\d{18})$
"\(?(00)\)?(\d{18})" + gs, _

'Groupe [2]
'Balise: 01, 02
'Pattern GS1: ^X(\d{14})$
"\(?(0[12])\)?(\d{14})" + gs, _

'Groupe [3]
'Balise: 10, 21, 22, 243, 254, 420, 710, 711, 712, 713, 714, 715, 4318, 7020, 7021, 7022, 7240, 8002, 8012  
'Pattern GS1:  ^X([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,20})$
'caracteresOK = "["!%-?A-Z_a-Z]"
'Pattern GS1 Modifier = ^X(["!%-?A-Z_a-Z]{0,20})$
"(\(?(2[12]|10|243|254|520|71[0-5]|4318|702[0-2]|7240|8002|8012)\)?" + caracteresOK + "{0,20})" + fnc1, _

'Groupe [4]
'Balise: 20
'Pattern GS1: ^20(\d{2})$
"\(?(20)\)?(\d{2})" + gs, _

'Groupe [5]
'Balise: 235
'Pattern GS1: ^235([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,28})$
'caracteresOK = "["!%-?A-Z_a-Z]"
'Pattern GS1 Modifier = ^235(["!%-?A-Z_a-Z]{0,28})$
"(\(?(235)\)?" + caracteresOK + "{0,28}?)" + fnc1, _

'Groupe [6]
'Balise: 90, 240, 241, 250, 251, 400, 401, 403, 4308, 4319, 7002, 7023, 8004  
'Pattern GS1:  ^X([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,30})$
'caracteresOK = "["!%-?A-Z_a-Z]"
'Pattern GS1 Modifier = ^X(["!%-?A-Z_a-Z]{0,30})$
"(\(?(90|24[0-1]|25[0-1]|40[0-13|4308|7319|7002|7023|8004)\)?" + caracteresOK + "{0,30})" + fnc1, _

'Groupe [7]
'Balise: 242
'Pattern GS1:  ^242(\d{0,6})$
"(\(?(242)\)?(\d{0,6})" + gs, _

'Groupe [8]
'Balise: 253
'Pattern GS1: ^253(\d{13})([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,17})$
'caracteresOK = "["!%-?A-Z_a-Z]"
'Pattern GS1 Modifier = ^253(\d{13})(["!%-?A-Z_a-Z]{0,17})$
"(\(?(253)\)?(\d{13})(" + caracteresOK + "{0,17}?)" + fnc1, _

'Groupe [9]
'Balise: 255
'Pattern GS1:  ^255(\d{13})(\d{0,12})$
"(\(?(255)\)?(\d{13})(\d{0,12}?)" + fnc1, _

'Groupe [10]
'Balise: 30, 37
'Pattern GS1: ^X(\d{0,8})$
"(\(?(30|37)\)?(\d{0,8}?)" + fnc1, _

'Groupe [11]
'Balise: 
'11, 12, 13, 15, 16, 17 
'3100 à 3105, 3110 à 3115, 3120 à 3125, 3130 à 3135, 3140 à 3145, 3150 à 3155, 3160 à 3165,
'3300 à 3305, 3310 à 3315, 3320 à 3325, 3330 à 3335, 3340 à 3345, 3350 à 3355, 3360 à 3365, 3370 à 3375,
'3500 à 3505, 3510 à 3515, 3520 à 3525, 3530 à 3535, 3540 à 3545, 3550 à 3555, 3560 à 3565, 3570 à 3575,
'3200 à 3205, 3210 à 3215, 3220 à 3225, 3230 à 3235, 3240 à 3245, 3250 à 3255, 3260 à 3265, 3270 à 3275, 3280 à 3285, 3290 à 3295,
'3400 à 3405, 3410 à 3415, 3420 à 3425, 3430 à 3435, 3440 à 3445, 3450 à 3455, 3460 à 3465, 3470 à 3475, 3480 à 3485, 3490 à 3495,
'3600 à 3605, 3610 à 3615, 3620 à 3625, 3630 à 3635, 3640 à 3645, 3650 à 3655, 3660 à 3665, 3670 à 3675, 3680 à 3685, 3690 à 3695,
'3950 à 3959,
'4326, 7006, 8005
'Pattern GS1: ^X(\d{6})$
"\(?(1[123567]|31[0-6][0-5]|3[35][0-7][0-5]|3[246]\d[0-5]|395\d|4326|7006|8005)\)?(\d{6})" + gs, _

'Groupe [12]
'Balise: 7007
'Pattern GS1: ^7007(\d{6,12})$
"(\(?(7007)\)?(\d{6,12})?)" + fnc1, _

'Groupe [13]
'Balise: 7011
'Pattern GS1:  ^7011(\d{6})(\d{0,4})$
"(\(?(7011)\)?(\d{6})(\d{0,8}?)" + fnc1, _

'Groupe [14]
'Balise: 3900 à 3909, 3920 à 3929 
'Pattern GS1:   ^X(\d{0,15})$
"(\(?(390[0-9]|392[0-9])\)?(\d{0,15})?)" + fnc1, _

'Groupe [15]
'Balise: 3910 à 3919, 3930 à 3939  
'Pattern GS1:    ^X(\d{3})(\d{0,15})$
"(\(?(391[0-9]|393[0-9])\)?(\d{3})(\d{0,15})?)" + fnc1, _

'Groupe [16]
'Balise: 3940 à 3943, 8111 
'Pattern GS1:  ^X(\d{4})$
"(\(?(394[0-3]|8111)\)?(\d{4})?)" + fnc1, _
0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
2 nov. 2023 à 14:34

Testé avec:

Sub Test()
Dim codes() As Variant
Dim Code As Variant
'mise de plusieurs codes de test dans un tableau
codes = Array("01095011014200693922995" + Chr(29) + "32020001001721061542025630" + Chr(29) + "2112345678", "010084399701277511230201213000172613" + Chr(29) + "2409797" + Chr(29) + "24129346", "]C1010060791513760121200005429" + Chr(29) + "111906063001" + Chr(29) + "101356981", "010088483808258821DE7840AL82" + Chr(29) + "90867030" + Chr(29) + "91867030")

For Each Code In codes
    Debug.Print (Code)
    Debug.Print (TestNeriXs4(CStr(Code)))
    Debug.Print ("")
Next
    
End Sub
0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
Modifié le 2 nov. 2023 à 18:31

Je pense avoir trouvé mon problème!

 Sur ton poste #88, le pattern 9X a une coquille:

"(\(?9[1-9]\)?" + caracteresOK + "{0,90})" + fnc1 _

C'est Ok avec cette modification:

"\(?(9[1-9])\)?(" + caracteresOK + "{0,90}?)" + fnc1 _

Comme ton pattern 9X était mon modèle, j'ai reproduis le problème sur mes patterns

Je vérifie ça!

Arff, j'ai refait la bêtise de fusionner les AI 01 et 02.
Il ne faut pas vu que 01 peut- être précédé de ]xx

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
3 nov. 2023 à 10:51

Petite correction de mon message précédent, le second pattern ne submathera pas 12 ou 21'

'Groupe [2]
'Balise: 01, 02
'Pattern GS1: ^X(\d{14})$
"\(?(0[12])\)?(\d{14})"

Là on a un parfait exemple, de pattern que tu pourrais travailler avec regex101.

À cette étape, on a oublié le fnc du début, qui ne s'applique que pour l'AI 01.

https://regex101.com/r/LtbF4O/1

Peut-on trouver un pattern fusionné, de tel sorte que l'AI soit dans le groupe de capture 1 et la data dans le 2.

Au moment où je tape ces lignes, je n'en sais rien (et j'ai pas vba sous la main, juste regex 101).

D'abord, je vire les parenthèses optionnelles du pattern.

Ensuite, je teste avec un ou

https://regex101.com/r/LtbF4O/2

Je capture bien les 2 premières lignes et j'ai bien mes données dans les bons groupes de capture.

Ensuite j'ajoute un ]C1 optionnel qui le fait pas un groupe de capture (on traitera tous les cas si on s'en sort avec celui-ci)

https://regex101.com/r/LtbF4O/3
Là, mauvaise donne, je n'ai pas 3 troisième groupe de capture (qui en plus s'insèrerait au début et donc passerait l'AI au 2eme et la data au 3eme). Mais ]C1 est inclus dans le groupe de capture 1 (et c'est logique il est à l'intérieur de la parenthèse capturante).

Là plusieurs options

  • on sépare les patterns comme tu l'as fait
  • on ne s'embête pas plus avec les regex, on virera le ]C1 dans le traitement ultérieur 
  • on essaye de sortir]C1 de la parenthèse capturante, à première vue, on risque de mathcer ]C102 aussi, est-ce grave? Si ce cas ne se présente jamais non, si ce cas peut arriver, à toi de voir https://regex101.com/r/LtbF4O/4
  • on continue d'essayer de trouver un pattern qui ne capture pas ]C1 avec 02, ne le mets pas dans le groupe 1, ne décale pas les groupes existants (c'est pas gagné)
  • on passe un pattern de remplacement avant de décomposer le code, si le code débute par ]C101, on vire ]C1 https://regex101.com/r/RkwX0b/1 et du coup en peut appliquer le pattern qui capture les AI 01 et 02
  • on peut faire en sorte que ]C1 crée le groupe de capture 1, donc l'AI dans le 2 et la data dans le 3 et modifier le traitement vba pour qu'il ne prenne plus les submatches 1 et 2 mais avant dernier et dernier 

Quelque soit ton choix, c'est seulement après que tu rajoutes les parenthèses optionnelles en dehors du groupe de capture de l'AI


0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
3 nov. 2023 à 11:42

Les possibilités ne manquent pas!

Mais au final, est-ce vraiment un problème de gérer les AI 01 et 02 séparément ?

"(?:](?:C1|e0|d2|Q3|J1))?\(?(01)\)?(\d{14})" + gs, _
"\(?(02)\)?(\d{14})" + gs, _

Même si au final, il y aura une cinquantaine de patterns à gérer, la solution que tu as développée semble robuste ?

On évite les cas imprévus.

Au passage pour le traitement des descriptions, quand celle-ci est la même pour plusieurs AI.

Vois-tu un inconvénient à l'utilisation d'un Select Case avec Case multiple ?

Dans l'idée, pour les AI 3100 à 3105 : POIDS NET (kg)
 

    Select Case AI
        Case "3100", "3101", "3102", "3102", "3104", "3105"
            madescription = "(" + AI + ")  POIDS NET (kg): "
0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
3 nov. 2023 à 14:12

Mais au final, est-ce vraiment un problème de gérer les AI 01 et 02 séparément ?

C'est ton choix, tu voulais que je tente de détailler comment écrire et valider les patterns fusionnés, j'ai pris ça comme exemple.

C'est toi qui choisis.


Vois-tu un inconvénient à l'utilisation d'un Select Case avec Case multiple ?

Non au contraire, mais tu peux aussi utiliser un tableau excel comme je te l'avais proposé.

1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
3 nov. 2023 à 16:52

Pas de problème, tes explications sont bonnes à prendre et me facilite la recherche, encore merci pour le temps accordé.

Juste pour lever un petit doute.

Concernant ce pattern:
^255(\d{13})(\d{0,12})$
\d = pour [0-9]
{13} = 13 caractères
\d = pour [0-9]
{0,12} = de 0 à 12 caractères
Donc la valeur de 255 est de 13 chiffres + suite de 0 à 12 caractères
Donc 255 peut couvrir une suite de 13 à 25 caractères
C'est bien ça?

Au fait, dans un précèdent poste du avais donné des patterns de substitution au patterns GS1.

Soit:
GS1 que tu as déjà optimisé : [\x21-\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]
Substitution : ["!%-?A-Z_a-Z]
VBA ne semble pas aimer le guillemet entre crochets!

Idem pour: [\x21\x22\x25-\x39\x5F\x61-\x7A]
Substitution : [!"%-9_a-z]

Je n'ai pas eu l'occasion de tester avec celui-ci:
GS1 que tu as aussi optimisé : [\x21\x22\x25-\x39\x5F\x61-\x7A]
Substitution : [#\x2D/0-9A-Z]

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
3 nov. 2023 à 17:44

Donc 255 peut couvrir une suite de 13 à 25 caractères
C'est bien ça?

Oui, mais du coup \d{13, 25} devrait faire l'affaire.

VBA ne semble pas aimer le guillemet entre crochets!

Non, mais le guillemet signe la fin de la string, il faut l'échapper et je ne sais plus comment on fait en vba double guillemets peut-être.

Mais sinon, avec les valeurs hexa ça va le faire


0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
3 nov. 2023 à 17:46
1
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
3 nov. 2023 à 19:50

Je galère avec ce pattern:

Pattern du Site SG1=
^253(\d{13})([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,17})$

Pattern que j'essaie de construire
"\(?(253)\)?(\d{13})?(" + caracteresOK + "{0,17}?)" + fnc1, _

Où:
fnc1 = "(\x1d|$|\()"
caracteresOK = "[\x21\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]"

Code de test avec 13 caractères après 253:
codes = Array("01073324141243592531234567891234" + Chr(29) + "210000107668" + Chr(29) + "11210208")

J'obtiens

Test 1:
253 vaut 13 caractères:


0107332414124359253123456789123421000010766811210208
(01)07332414124359(253)1234567891234(21)0000107668(11)210208
(01) N° ARTICLE (GTIN): 07332414124359
(253) Déscription non codée : 1234567891234
(21) N° SÉRIE: 0000107668
(11) test: 210208
Test 1 OK

Test 2:
253 vaut 12 caractères:


010733241412435925312345678912321000010766811210208
(01)07332414124359(253)(21)0000107668(11)210208
(01) N° ARTICLE (GTIN): 07332414124359
(253) Déscription non codée :
(21) N° SÉRIE: 0000107668
(11) test: 210208
Test 2 ECHEC, J'ai un vide entre 253 et 21:
(01)07332414124359(253)(21)0000107668(11)210208
Vide aussi dans le détail
(253) Déscription non codée :

Test 3:
253 vaut 14 caractères:
01073324141243592531234567891234521000010766811210208
(01)07332414124359(253)1234567891234(21)0000107668(11)210208
(01) N° ARTICLE (GTIN): 07332414124359
(253) Déscription non codée : 1234567891234
(21) N° SÉRIE: 0000107668
(11) test: 210208
Test 4 ECHEC, seulement 13 caractère prit en compte

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
3 nov. 2023 à 20:26

Selon le pattern du site, il y a 13 chiffres suivi de 0 à 17 caractères.

Donc tu ne dois pas mettre de ? après \d{13}, ni après caracteresOK{0,17}.

Et ton test 2 est forcément en échec.

Leur pattern crée 3 groupes de capture, ce qui ne nous arrange pas, puisqu'on prend la data dans le 2ème uniquement.

Mais surtout, je n'en vois pas la nécessité

  • il n'y a pas de ou
  • {13} et {0,17} n'ont pas besoin d'être dans un groupe

Bref, ces 2 groupes n'ont pas de raison d'être. Il faut les fusionner

"\(?(253)\)?(\d{13}" + caracteresOK + "{0,17})" + fnc1, _
1
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
3 nov. 2023 à 20:40

Ces patterns sont dans le même cas ?

^255(\d{13})(\d{0,12})$

^7011(\d{6})(\d{0,4})$

^3910(\d{3})(\d{0,15})$

^423(\d{3})(\d{0,12})$

^8008(\d{8})(\d{0,4})$

Encore pire 3 groupes

^8006(\d{14})(\d{2})(\d{2})$

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
Modifié le 3 nov. 2023 à 21:58

J'ai tenté ceci:

^255(\d{13})(\d{0,12})$

"\(?(255)\)?(\d{13}\d{0,12})" + fnc1, _

^7011(\d{6})(\d{0,4})$

"\(?(7011)\)?(\d{6}\d{0,4})" + fnc1, _

^3910(\d{3})(\d{0,15})$

"\(?(3910)\)?(\d{3}\d{0,15})" + fnc1, _

^423(\d{3})(\d{0,12})$

"\(?(423)\)?(\d{3}\d{0,12})" + fnc1, _

^8008(\d{8})(\d{0,4})$

"\(?(8008)\)?(\d{8}\d{0,4})" + fnc1, _

^8006(\d{14})(\d{2})(\d{2})$

"\(?(8006)\)?(\d{14}\d{0,2}\d{0,2})" + fnc1, _
0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
3 nov. 2023 à 22:56

Pour 8006, c'est \d{2} pas \d{0,2}

Sinon, tu peux cumuler les \d => \d{13}\d{0,12} = \d{13,25}

Je pense qu'ils les ont séparés car les 13 premiers chiffres doivent avoir une signification et les 0 à 12 suivants une autre.

1
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1 > Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024
4 nov. 2023 à 00:07

C'est toute à fait ça.

Par exemple pour L'AI 8006 = N14+N2+N2

N14 = AI 01 à 14 chiffres

Le 1er N2 = N° de la pièce (2 chiffres)

Le 2éme N2 = Nombre total de pièces (2 chiffres)

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
4 nov. 2023 à 09:05

N14 = AI 01 à 14 chiffres

Non, l'AI 14 chiffres tout pile, quand c'est de 1 à 14, il y a N1....14 dans le descriptif.

Je vois 2 façons de faire,

  • soit on modifie la méthode init pour quelle stocke différemment les données si on lui donne plus que 2 paramètres. Mais, encore faut il savoir comment stocker dans quels cas
  • soit dans le select case, pour les cas en question, tu redécoupes la donnée soit avec Left et right, quand tu as au moins une longueur fixe, soit en regex

Perso j'opterais pour la seconde.

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
4 nov. 2023 à 12:04

Il manque ))? après J1

1
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
5 nov. 2023 à 12:01

Bonjour,

Je suis tombé sur les éléments qui compose un AI!

Ce n'est pas inclue à ma dodo liste, mais qui sait pour plus tard.

Pour l'AI 253

Ce qu'on utilise déjà:
253 => N3+N13[+X..17] => ^253(\d{13})([\x21\x22\x25-\x3F\x41-\x5A\x5F\x61-\x7A]{0,17})$

Les éléments
253=N13,csum,key [X..17]

Soit:

N13 = 13 caractères numérique

Csum =

 {
  
         int weight;
         int parity = 0;
         const char *p;
         size_t len, pos;
  
         assert(data);
  
         len = strlen(data);
  
         /*
          * Data must include at least the check digit.
          *
          */
         if (*data == '\0') {
                 if (err_pos) *err_pos = 0;
                 if (err_len) *err_len = 0;
                 return GS1_LINTER_TOO_SHORT_FOR_CHECK_DIGIT;
         }
  
         /*
          * Data must consist of all digits.
          *
          */
         if ((pos = strspn(data, "0123456789")) != len) {
                 if (err_pos) *err_pos = pos;
                 if (err_len) *err_len = 1;
                 return GS1_LINTER_NON_DIGIT_CHARACTER;
         }
  
         /*
          * Calculate the sum of the numeric values of the data, excluding the
          * check digit, weighted by alternating ...3:1:3 values, from right to
          * left.
          *
          * The check digit is valid if its value, when added to the data
          * checksum, makes the overall sum a multiple of 10.
          *
          */
         weight = len % 2 == 0 ? 3 : 1;
         p = data;
         while (*(p+1)) {
                 parity += weight * (*p++ - '0');
                 weight = 4 - weight;
         }
         parity = (10 - parity % 10) % 10;
  
         if (parity + '0' != *p) {
                 if (err_pos) *err_pos = len - 1;
                 if (err_len) *err_len = 1;
                 return GS1_LINTER_INCORRECT_CHECK_DIGIT;
         }
  
         return GS1_LINTER_OK;
  
 }


Key =

 {
  
         size_t i, len;
  
         assert(data);
  
         len = strlen(data);
  
         /*
          * The current minimum GCP length is defined by GCP_MIN_LENGTH.
          *
          */
         if (len < GCP_MIN_LENGTH) {
                         if (err_pos) *err_pos = 0;
                         if (err_len) *err_len = len;
                         return GS1_LINTER_TOO_SHORT_FOR_KEY;
         }
  
         /*
          * Any character within the minimum-length GCP prefix that is outside
          * the range '0' to '9' is illegal.
          *
          */
         for (i = 0; i < GCP_MIN_LENGTH; i++) {
                 if (data[i] < '0' || data[i] > '9') {
                         if (err_pos) *err_pos = i;
                         if (err_len) *err_len = 1;
                         return GS1_LINTER_INVALID_GCP_PREFIX;
                 }
         }
  
         /*
          * Call the custom GCP lookup routine if one has been provided.
          *
          */
 #ifdef GS1_LINTER_CUSTOM_GCP_LOOKUP
 {
         int valid = 0, offline = 0;
         GS1_LINTER_CUSTOM_GCP_LOOKUP(data);
         if (offline)
                 return GS1_LINTER_GCP_DATASOURCE_OFFLINE;
         else if (!valid)
                 return GS1_LINTER_INVALID_GCP_PREFIX;
 }
 #endif
  
         return GS1_LINTER_OK;
  
 }


X = CSET 82

 {
  
         /*
          * All characters in "CSET 82", the 82 character alphabet.
          *
          */
         static const char *cset82 =
                 "!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRS"
                 "TUVWXYZ_abcdefghijklmnopqrstuvwxyz";
  
         size_t pos;
  
         assert(data);
  
         /*
          * Any character outside of CSET 82 is illegal.
          *
          */
         if ((pos = strspn(data, cset82)) != strlen(data)) {
                 if (err_pos) *err_pos = pos;
                 if (err_len) *err_len = 1;
                 return GS1_LINTER_INVALID_CSET82_CHARACTER;
         }
  
         return GS1_LINTER_OK;
  
 }


De ce que je comprends:

L'AI 253 est composé de 12 caractères numérique + une clé de contrôle + 0 à 17 caractères quelconques.

Cette clé de contrôle est calculée de cette façon:

On attribue le rang de 1 à 13 et de droite à gauche.
13 12 11 10 9 8 7 6 5 4 3 2 1
Où 1 est la clé de contrôle calculé, on en tien donc pas compte.

Exemple:
34531023645?

On additionne les chiffres du code de rang paire
4 + 3 + 2 + 2 + 6 + 5 = 22

On multiplie le résultat par 3
22 * 3 = 66

On additionne les chiffres du code de rang impair
3 + 5 + 1 + 0 + 3 + 4 = 16

On additionne les deux résultats:
66 + 16 = 82

On soustrait le résultat du multiple de 10 supérieur
90 – 82 = 8
La clé de contrôle est 8

L'AI 253 est donc:
34531023645 + 8 + 0 à 17 caractères quelconques.

Lorsque le résultat des additions est un multiple de 10 la clé de contrôle est égal à 0.

Penses-tu que cela soit applicable facilement en VBA sous la case 253 du module de class unCode?

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
Modifié le 5 nov. 2023 à 23:01

Il manque un 2 dans l'exemple:

Exemple:
345312023645?

Le code de l'AI 253 est donc:
345312023645 + 8 + 0 à 17 caractères quelconques.

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
6 nov. 2023 à 07:19

Bonjour

oui, par contre, dans le code C que tu as posté, ils ont fair une fonction pour ça.

Ça laisse entendre que d'autres data pourraient être validées pas un checksum de ce type.

Je pense donc qu'il faut faire de même, et appeler cette fonction chaque fois que c'est nécessaire.


0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
6 nov. 2023 à 09:07

Oui, Il y a le détaille ici:


https://github.com/gs1/gs1-syntax-dictionary/blob/main/gs1-syntax-dictionary.txt

Gros travail, plusieurs fonctions, mais je suis incapable de les porter sous VBA !


https://gs1.github.io/gs1-syntax-dictionary/index.html

Et tout un projet:


https://github.com/gs1/gs1-syntax-engine

Projet que je viens de tester en version compilé, mais qui impose un FNC1 de début pour chaque code lut.


https://github.com/gs1/gs1-syntax-engine/releases/tag/2023-07-05

App Windows:
 

https://github.com/gs1/gs1-syntax-engine/releases/download/2023-07-05/gs1encoders-windows-gui-app.zip

Cet App utilise une Dll, mais je doute que ce soit exploitable sous VBA:
 

https://github.com/gs1/gs1-syntax-engine/releases/download/2023-07-05/gs1encoders-windows-libs.zip

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
6 nov. 2023 à 16:07

S'il ne s'agit que du checksum, tu as décrit l'algo, il n'est pas très compliqué, y'a plus qu'à

Pas besoin de savoir lire le C.


0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
6 nov. 2023 à 23:24

Dans l'algorithme que je décris et seulement pour trouver la clé d'une chaine de 12 caractères:

Function FindKey13(ForString12)
For i = 1 To Len(ForString12)
    s = s + Mid(ForString12, i, 1) * (1 + (1 - i Mod 2) * 2)
Next i
    If s Mod 10 = 0 Then
        FindKey13 = 0
    Else
        FindKey13 = 10 - s Mod 10
    End If
End Function

En testant le générateur de clés GS1
https://www.gs1.fr/calculer-cle-controle

Je vois qu'il peut générer les clés suivantes:

GTIN-8, soit 7 caractères + 1 caractère la clé.
GTIN-12, soit 11 caractères + 1 caractère la clé.
GTIN-13, soit 12 caractères + 1 caractère la clé.
GTIN-14, soit 13 caractères + 1 caractère la clé.
GSIN-17, soit 16 caractères + 1 caractère la clé.
SSCC-18, soit 17 caractères + 1 caractère la clé.

Ces codes sont présents dans mes AIs, mais là je ne sais pas comment gérer.

L'utilisation de Mod, m'évite de me perdre dans les nombres paires ou impaires, mais complique la tâche.

0

Là pour le coup, lire le C aurait pu t'aider.

Pour alterner le facteur de multiplication, ils ont fait

facteur = 4 - facteur 'si facteur vaut 1 alors, il vaudra 3 et inversement

Du coup, il suffit de donner une valeur de départ en fonction de la longueur de la chaine.

Function CheckSum(Data As String) As Boolean
    Dim s, key As Integer
    s = 0
    Dim f As Integer
    Dim valeur As Variant
    
    key = CInt(Right(Data, 1)) 'la clé c'est le carractère de droite
    valeur = Left(Data, Len(Data) - 1) 'la valeur c'est le reste
    
    'facteur de départ en fonction de la longeur de la valeur
    If Len(valeur) Mod 2 = 0 Then
        f = 1
    Else
        f = 3
    End If
    
    For i = 1 To Len(valeur)
        s = s + CInt(Mid(valeur, i, 1)) * f
        f = 4 - f
    Next i
    
    'on vérifie si la clé est bonne
    If s Mod 10 = 0 Then
        CheckSum = (key = 0)
    Else
        CheckSum = (key = 10 - s Mod 10)
    End If
    
End Function

Sub test()
    'sur le site que tu donnes 1234567 => 0
    Debug.Print "pour 12345670"
    Debug.Print CheckSum("12345670")
    
    'sur le site que tu donnes 123456789012 => 8
    Debug.Print "pour 1234567890128"
    Debug.Print CheckSum("1234567890128")

    'sur le site que tu donnes 123456789012 => 8
    Debug.Print "pour 1234567890123"
    Debug.Print CheckSum("1234567890123")
    
End Sub
1
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
7 nov. 2023 à 14:41

Impeccable, testé et validé pour GTIN-8, GTIN-12, GTIN-13, GTIN-14, GSIN-17 et SSCC-18.

Je mets de côté, car là je m'écarte du sujet de départ.

Je me remets dès ce soir sur mes Patterns.

Merci.

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
8 nov. 2023 à 00:43

Bonsoir,

En voulant garder un code lisible, j'ai continué de mettre sur une ligne différente chaque pattern.

Patterns = Array("Pattern1", _
                 "Pattern2", _
                 "Pattern3" _
                 "Pattern3", _
                 "Pattern4" _
                 "Pattern5" _
                 "Pattern6" _
                 )

Je me retrouve avec le message "Trop de caractères de continuité de ligne"

Je peux réduire:

Patterns = Array("Pattern1", "Pattern2", "Pattern3" _
                 "Pattern4", "Pattern5", "Pattern6" _
                 )

Mais, c'est bien moins lisible.

J'ai tenté :

patterns = strPatterns
           strPatterns = "Pattern1"
           strPatterns = strPatterns & "Pattern2"
           strPatterns = strPatterns & "Pattern3"
           strPatterns = strPatterns & "Pattern4"
           strPatterns = strPatterns & "Pattern5"
           strPatterns = strPatterns & "Pattern6"

Je n'avais pas pensé a "For Each pattern In patterns" qui utilise le "Array"

Voix tu une possibilité autre que de moins Utiliser de caractères de continuité de ligne "_" ?

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
8 nov. 2023 à 09:16

Bonjour,

Une Collection, Pourquoi je ni penses pas!

Je ne sais pas si on peut optimiser :

Sub ListPatterns()

Dim patterns As New Collection

patterns.Add "MonPattern 1"
patterns.Add "MonPattern 2"
patterns.Add "MonPattern 3"

For Each pattern In patterns
    If pattern = "MonPattern 2" Then
        MsgBox pattern & ", est présent dans la liste!"
    End If
Next pattern

End Sub
0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
8 nov. 2023 à 10:58

Je pense pas que tu puisses faire mieux en vba.

0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
8 nov. 2023 à 13:08

Je reviens sur les patterns avec 2 groupes de data

"\(?(703[0-9])\)?(\d{3}" + caracteresOK + "{0,27}?)" + fnc1

Que je test sous regex101 avec des nombres a la place des caractères OK

^\(?(703[0-9])\)?(\d{3}\d{0,27})\(

Ici cela nous donne un groupe de 3 + 27 caractère soit 30 caractères.

Soit: ^\(?(703[0-9])\)?(\d{3,30})\( qui revint à ^\(?(703[0-9])\)?(\d{30})\(

Comme tu l'évoquais, ces groupes de data, ici 3 caractères pour le 1er et 0 à 27 caractères pour le second ont une raison.

J'envisage si c'est possible d'exploiter ces groupes de data.

J'ai repris nos échanges, mais n'ai pas retrouvé ce que cela impacterait de tenter de les prendre en charge ?

Il y a aussi le cas des AI 8006 et 8026 qui elles ont 3 groupes de data:

Format : N4+N14+N2+N2
Pattern GS1: ^8006(\d{14})(\d{2})(\d{2})$

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
8 nov. 2023 à 13:23
0
NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024 1
Modifié le 8 nov. 2023 à 14:48

Citation:
•    soit on modifie la méthode init pour quelle stocke différemment les données si on lui donne plus que 2 paramètres. Mais, encore faut il savoir comment stocker dans quels cas
•    soit dans le select case, pour les cas en question, tu redécoupes la donnée soit avec Left et right, quand tu as au moins une longueur fixe, soit en regex

Je serai tenté de pencher pour la 1ère solution à un stockage de données par groupe et dans l'ordre, mais j'ai beaucoup de difficultés à me projeter là-dessus et encore moins sur le comment faire.
Il faut pouvoir exploiter cela après.

Si je reprends:
AI 8006
N14+N2+N2
8006 = 1er groupe, groupe de capture
N14 = 2 eme groupe, groupe data 1
N2 = 3 eme groupe, groupe data 2
N2 = 4 eme groupe, groupe data 3

La deuxième solution, depuis le Select Case, vu qu'on fusionne les groupes:

De:

"\(?(253)\)?(\d{13})?(" + caracteresOK + "{0,17}?)" + fnc1

Pour:

"\(?(253)\)?(\d{13}" + caracteresOK + "{0,17})" + fnc1

Je ne sais pas trop comment les exploiter.

Il y a encore du triturage de cerveau dans l'air !

Personnellement comment gérerais-tu ?

0
Whismeril Messages postés 19041 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mai 2024 656
8 nov. 2023 à 14:47

Comment voudrais-tu que ce soit affiché ?


0
Rejoignez-nous