[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 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 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

Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
26 oct. 2023 à 19:03

Déjà, on n'a jamais pris en compte les chevrons, pour l'instant, je les ai enlevés du code.

Ensuite, y'a une garouille avec les parenthèses.

Et puis, sur la 21eme page de codes GS1, dans les regex 9x, y'a pas le . avant le [

"(\(?9[1-9]\)?)([\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,90}?)(?:GS|$|\x1d|\()"

Et une fois tout ça corrigé, il me matche la balise 91 et une 86, alors que je n'ai pas codé de pattern qui cherche 86....

010088483808258821DE7840AL79GS91867031
(01)00884838082588(21)DE7840AL79(91)(86)7031
(01) GTIN de l’article: 00884838082588
(21) Numéro de série: DE7840AL79

7031

Y'a forcément encore un truc qui m'échappe....


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
26 oct. 2023 à 19:13

Ha punaise, y'avait encore une garouille avec les parenthèses

"(\(?9[1-9]\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{1,90}?)(?:GS|$|\x1d|\()"

Bon du coup, faut-il prendre en compte les chevrons autour de GS?

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

C'est OK, ça match, bien joué!

Non les chevrons autour de GS ne sont pas à prendre en compte, Désolé.

Je ne parviens pas à faire prendre en charge les balises de 3 ou 4 caractères en plus des balises de 2 caractères.

Pourrais-tu regarder?

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
26 oct. 2023 à 20:22

J'avais laissé passer une coquille pour les tests

"(\(?9[1-9]\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,90}?)(?:GS|$|\x1d|\()"

Avant de regarder les 3 ou 4 caractères, je vais essayer de rationaliser un peu.

Par exemple, la liste de code hexa là, n'est pas optimisée.


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
26 oct. 2023 à 21:05

Déjà, 

dans la liste, on constate que beaucoup de parties (celles à taille variable) requièrent une fin, soit le texte GS, soit le caractère GS, soit une parenthèse, soit la fin du texte.

Et celles qui sont à taille fixe peuvent quand même rencontrer un GS ou un GS.

On peut commencer par ça

'écriture des patterns unitaires
gs = "(?:GS|\x1d)?" 'quand c'est peut-être
fnc1 = "(?:GS|$|\x1d|\()" 'quand c'est obligé
pattern01 = "^(?:](?:C1|e0|d2|Q3|J1))?(\(?01\)?.{14})" + gs
pattern11 = "(\(?11\)?\d{6})" + gs
pattern17 = "(\(?17\)?\d{6})" + gs
pattern10 = "(\(?10\)?.{1,20}?)" + fnc1
pattern21 = "(\(?21\)?.{1,20}?)" + fnc1

Ensuite, à l'instar des 9X, les 1x pourraient devenir

pattern1X = "(\(?1[1-35-7]\)?\d{6})" + gs

Mais, ça ne marche pas. S'il y a un 11 et un 17, ça matche, mais ensuite seul le 2eme est pris en compte.

Quand on regarde avec regex101, on voit qu'il y a des submatches de submatches. En .Net, je sais gérer ça, en VBA, j'ai pas encore trouvé, et le problème va se poser aussi, si tu as plusieurs 9X


Ensuite, pour les patterns 10 et 21 nous on a mis un .{1,20}, mais dans le tableau c'est la même liste de caractères que pour les 9x (liste pas optimisée non plus) et ils ont mis {0, 20}, ce qui veut dire que tu pourrais avoir la balise sans info derrière.


0

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
Modifié le 26 oct. 2023 à 22:34

Le GS texte, c'est moi qui l'ai imposé pour tester sans lecteur de code-barres.

\x1d, c'est depuis le lecteur de code-barres.

Pour les 1x, je n'ai pas compris ton pattern.

pattern1X = "(\(?1[1-35-7]\)?\d{6})" + gs

1[1-35-7] = 11 ou 135 ou 17 ?
1[1-35-7] = 11 à 135 et 135 à 17 ?

J'ai donné le nom de 9X pour les balises du groupe 54) de 91 à 99 qui ont le même pattern, 90 ayant un pattern différant.

On peut utiliser 1X pour le groupe 4), soient les balises 11, 12, 13, 15, 16, 17 qui ont elles aussi le même pattern.

Il est peut-être plus judicieux de nommer les pattern par groupe

G= groupe

Soit:

patternG1 à patternG54, même si certains groupes n'ont qu'une seule balise.
Voir ma réponse https://codes-sources.commentcamarche.net/forum/affich-10112115-regex-recherche-patten-de-capture-un-defi?page=3#p10112220

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
27 oct. 2023 à 08:25


Pour les 1x, je n'ai pas compris ton pattern.

......

On peut utiliser 1X pour le groupe 4), soient les balises 11, 12, 13, 15, 16, 17 qui ont elles aussi le même pattern

Voilà ce pattern match 11, 12, 13, 15, 16 et 17, mais du coup en VBA, y'a que la 2eme capture qui est prise en compte avec notre code actuel.

Et comme j'ai appliqué le même principe pour les 9x s'il y a un AI 99 puis un 91, tu n'auras que le 91.

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656 > Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024
27 oct. 2023 à 08:28
0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
27 oct. 2023 à 09:44

Pour illustrer plus clairement mon propos.

Voici un premier exemple, c'est notre pattern avec un de tes codes (avec des parenthèses pour que ce soit plus lisible) et les AI 11 et 17

https://regex101.com/r/3Mmy10/1

Dans l'encart Match Information, on voit que la regex capture bien le texte entier, mais que le groupe 2 c'est (17).... et du coup (11)... est ignoré.

Dans ce second exemple, j'ai juste changé de moteur, j'ai pris celui de .Net

https://regex101.com/r/3Mmy10/2

Là, on voit un groupe 2.1 qui est (11)... et un groupe 2.2 (17)...

VBA se comporte comme l'exemple 1, mais pour rationaliser (notamment pouvoir utiliser le pattern 9X et le 1X), il faudrait obtenir un comportement comme en .Net.

J'ai une idée mais j'ai pas le temps de tester maintenant.


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

J'ai porté le tableau des 54 groupes de patterns sur Excel, si ça peut aider!

Groupes de Patterns

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
27 oct. 2023 à 11:33

Si mon idée fonctionne, ça aidera


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
28 oct. 2023 à 23:20

Bon, 

je fais 2 pas en avant et 1 en arrière.

J'arrive à trouver les AI 11 et 17 avec un seul pattern qui matche 11, 12, 13, 15, 16 et 17.

Mais la façon de faire, trouve aussi 2 AI 21 là où il n.y en a qu'une.

Je suis sur une piste, mais ça devient une usine à gaz.

VBA c'est dans ton cahier des charges ou c'est parce que tu connais mieux qu'autre chose?


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

Je n'ai pas de cahier des charges particulier, mais plutôt des contraintes.

Je suis certes un peu plus à mon aise avec VBA est nos machines possèdent toutes Excel.

Les contraintes:

Le projet doit être facilement porté sur l'un des 4 postes informatique de notre service.

Le projet ne doit pas avoir recours à des solutions qui requièrent des licences que ces 4 postes informatiques ne possèdes déjà.

Je dois pouvoir le modifier en cas de besoin.

J'ai pensé à PHP, mais je n'ai jamais utilisé autre choses que des solutions clé en main, type serveur Wamp (pas sûr que notre service info nous l'autorise).

Si tu voix d'autres possibilités, je suis ouvert à tout!

Le but de ce projet et vraiment de nous faciliter le quotidien, la saisie manuelle de ces codes est fastidieuse et source d'erreurs.

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

Je me dis que finalement ta proposition de gérer les nouvelles balises individuellement à chaque fois que j'en rencontre une n'est pas si fastidieuse que ça!
Sur le code actuel, il faudrait permettre la gestion des balises de 3 et 4 caractères et je pourrais tester cela rapidement!

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 09:14

Sauf que dans les exemples que j'ai mis en #71 j'ai essayé tous les moteurs proposés.

Il semble que seul .Net permet de récupérer plusieurs submatches d'un même groupe.

J'ai fait un test avec Python, et effectivement apparemment, on ne peut pas.

Pour .Net, Visual Studio Community est gratuit sous conditions, ces conditions autorisent les petites sociétés (faut donc aller les lire..)

Le langage "pur .Net" c'est C#, (un descendant de C/C++ et Java), il y a aussi VB.Net (attention, faux ami de VBA lire ceci)

Je vais faire un test en .Net et je te le poste


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 09:47

En C#

        //patern fixe pour le test
        string pattern = @"^(?:](?:C1|e0|d2|Q3|J1))?(\(?01\)?.{14})(?:GS|\x1d)?(?:(\(?1[123567]\)?\d{6})(?:GS|\x1d)?|(\(?10\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{1,20}?)(?:GS|$|\x1d|\()|(\(?21\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{1,20}?)(?:GS|$|\x1d|\())+$";

        private string Decode(string code)
        {
            string res = "";
            //initialisation de la regex
            Regex maRegex = new Regex(pattern);
            Match m = maRegex.Match(code);

            //si le pattern est reconnu
            if (m.Success)
                for (int i = 1; i < m.Groups.Count; i++)
                {
                    //on regarde chaque goupe ayant matché (contrairement à VBA, y'a pas de groupes vides dans cette collection)
                    Group g = m.Groups[i];
                    foreach (Capture c in g.Captures)
                    {
                        //pour chaque groupe, on regarde les n captures.
                        res += "Groupe " + c.Value + " position " + c.Index + ", ";
                    }
                }

            return res;
        }

En VB.Net avec un traducteur en ligne (qui ne garde pas les commentaires, grr...)

    Private pattern As String = "^(?:](?:C1|e0|d2|Q3|J1))?(\(?01\)?.{14})(?:GS|\x1d)?(?:(\(?1[123567]\)?\d{6})(?:GS|\x1d)?|(\(?10\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{1,20}?)(?:GS|$|\x1d|\()|(\(?21\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{1,20}?)(?:GS|$|\x1d|\())+$"

    Private Function Decode(ByVal code As String) As String
        Dim res As String = ""
        Dim maRegex As Regex = New Regex(pattern)
        Dim m As Match = maRegex.Match(code)

        If m.Success Then

            For i As Integer = 1 To m.Groups.Count - 1
                Dim g As Group = m.Groups(i)

                For Each c As Capture In g.Captures
                    res += "Groupe " & c.Value & " position " + c.Index & ", "
                Next
            Next
        End If

        Return res
    End Function

Et le résultat pour ce code 010084399701370311210601213000105704GS17230601

"Groupe 0100843997013703 position 0, Groupe 11210601 position 16, Groupe 17230601 position 38, Groupe 213000105704 position 24, "

OK, je n'ai géré

  • ni l'ordre (mais chaque capture dispose de son index, il suffit d'appliquer une fonction de tri)
  • ni la mise entre parenthèses des AI (pour les AI à 2 caractères, ça va être aussi facile qu'en VBA, et pour les autres, dans tous les cas, il faudra réfléchir).

Avant que je creuse plus en .Net, dis-moi si ça pourrait être une alternative pour toi. 

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

Dans ton exemple tu utilises:

(\(?9[1-9]\)?[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,90})(?:GS|$|\x1d|\())+$

Soit un pattern multiple pour 91 à 99

Je faisais allusion a l'utilisation de patterns individuel comme :

"(\(?91\)?.[\x21-\x22\x25-\x2F\x30-\x39\x3A-\x3F\x41-\x5A\x5F\x61-\x7A]{0,90}?)(?:GS|$|\x1d|\()"

Concernant ces balises 9X pour le moment je n'ai rencontré que 91 et 93.

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

Pour Visual Studio Community c'est pas bon je fais partie d'un petit service (4 personnes) d'une grande entreprise (un hôpital, plus de 1500 employés).

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656 > NeriXs Messages postés 258 Date d'inscription lundi 4 mai 2015 Statut Membre Dernière intervention 27 février 2024
29 oct. 2023 à 10:46

En gratuit , y'a Visual Studio Code, mais ne fait pas VB.Net, sinon SharpDevelop

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

Je pense que tu as commenté ton dernier poste juste avant ma réponse ?

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

Si tu le veux bien, avant d'envisager une autre solution ou je ne suis vraiment pas à l'aise, j'aimerais tester les patterns individuels sous VBA comme on l'a fait jusqu’à présent.
Dans ce sens, pourrais du juste ajouter la prise en charge des balises de 3 et 4 caractères?
Partir du code ou tu as ajouté la classe, celui-ci : #52

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 16:35

Je ne peux pas passer encore des heures pour quelque chose qui ne mènera à rien.

Y'a pas 36 solutions soit on trouve une méthode qui découpe le code en parties que tu peux ensuite tester avec les regex telles que tu souhaites les regrouper ( mais je pressens que si on y arrive, c'est qu'on aura fait autrement et que les regex ne seront plus utiles).

Par exemple https://regex101.com/r/R4TIg3/1 ce cas te montre que le pattern 21 peut matcher la mauvaise partie du code s'il est seul

Ce second exemple type 2x, matche n'importe quoi.

Soit il faudra une regex avec les 500 cas et là, à mon avis elle ne fonctionnera car trop complexe, déjà que les 50 et quelques groupes, j'ai un doute, 500, c'est quasiment sûr c'est trop.

Pour moi à ce stade, s'embarquer dans les AI à 3 chiffres ne sert à rien tant qu'on a pas résolu le problème des patterns regroupés.


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 21:08

Alors, ton groupe 13 et ton groupe 4, c'est la même chose, donc je les ai fusionnés.

Remodif de la classe, parce que j'ai pas envie de coder 500 cases

'Champs utiles
Public AI As String

Public Code As String


'Initialise l'instance de l'objet UnCode
Public Sub Init(LaBalise As String, LeCode As String)
    AI = LaBalise
    Code = LeCode
End Sub


'Méthode qui retourne un texte sous la forme "(Balise)LeCode"
Public Function Texte() As String
    Texte = "(" & AI & ")" & Code
End Function

'Méthode qui retourne un texte sous la forme "(Balise) Description : LeCode"
Public Function Description() As String
    Dim madescription As String
    
    Select Case AI
        Case "01"
            madescription = "(01) GTIN de l’article: "
    
        Case "11"
            madescription = "(11) Date de production: "
            
        Case "17"
            madescription = "(17) Date d'expiration : "
            
        Case "10"
            madescription = "(10) Numéro de lot: "
            
        Case "21"
            madescription = "(21) Numéro de série: "
        
        Case "91"
            madescription = "(91) InfosInternes: "
        
        Case Else
            madescription = "(" + AI + ") Déscription non codée : "
            
    End Select
           
    Description = madescription + Code
End Function

Modif du code principal, pour fusionner le pattern existant avec le groupe 13 et rajouter le 9x, maintenant qu'on a vu que le garde-fou fonctionne

'on met les patterns unitaires dans un tableau
patterns = Array("(?:](?:C1|e0|d2|Q3|J1))?\(?(01)\)?(" + caracteresOK + "{14})" + gs, _
            "\(?(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, _
            "\(?(10)\)?(" + caracteresOK + "{1,20}?)" + fnc1, _
            "\(?(21)\)?(" + caracteresOK + "{1,20}?)" + fnc1, _
            "(\(?9[1-9]\)?" + caracteresOK + "{0,90})" + fnc1 _
            )
'selon ton tableau, regroupés par "longueurs"
'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

À toi de jouer avec les autres.

Et concernant la méthode Description, je pense que le mieux est d'exporter tous les onglets de cette page https://www.gs1.org/standards/barcodes/application-identifiers dans un fichier excel.

Tu fais une recherche dans la colonne des AI et tu prends la description écrite sur la même ligne


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 21:09

Un petit code de test

Sub Test()
Dim codes() As Variant
Dim Code As Variant
'mise de plusieurs codes de test dans un tableau
codes = Array("(01)00843997013703(11)210601(3630)123456(17)230601(21)3000105704" + Chr(29) + "(3233)123456", "(01)00843997013703(11)210601(17)230601(21)3000105704", "010088483808258821DE7840AL79" + Chr(29) + "91867031", "0107332414124359210000107668" + Chr(29) + "11210208", "(01)00843997013703(11)210601(17)230601(10)54gp75P(21)3000105704", "(01)00843997013703(11)210601(10)54gp75P(17)230601(21)3000105704", "]C10100883873867792112207071723070710220707" + Chr(29) + "21PC22412085")

For Each Code In codes
    Debug.Print (Code)
    Debug.Print (TestNeriXs4(CStr(Code)))
    Debug.Print ("")
Next
    

End Sub

et le resultat

(01)00843997013703(11)210601(3630)123456(17)230601(21)3000105704(3233)123456
(01)00843997013703(11)210601(3630)123456(17)230601(21)3000105704(3233)123456
(01) GTIN de l’article: 00843997013703
(11) Date de production: 210601
(3630) Déscription non codée : 123456
(17) Date d'expiration : 230601
(21) Numéro de série: 3000105704
(3233) Déscription non codée : 123456

(01)00843997013703(11)210601(17)230601(21)3000105704
(01)00843997013703(11)210601(17)230601(21)3000105704
(01) GTIN de l’article: 00843997013703
(11) Date de production: 210601
(17) Date d'expiration : 230601
(21) Numéro de série: 3000105704

010088483808258821DE7840AL7991867031
(01)00884838082588(21)DE7840AL79(91867031)
(01) GTIN de l’article: 00884838082588
(21) Numéro de série: DE7840AL79
(91867031) Déscription non codée : 

010733241412435921000010766811210208
(01)07332414124359(21)0000107668(11)210208
(01) GTIN de l’article: 07332414124359
(21) Numéro de série: 0000107668
(11) Date de production: 210208

(01)00843997013703(11)210601(17)230601(10)54gp75P(21)3000105704
(01)00843997013703(11)210601(17)230601(10)54gp75P(21)3000105704
(01) GTIN de l’article: 00843997013703
(11) Date de production: 210601
(17) Date d'expiration : 230601
(10) Numéro de lot: 54gp75P
(21) Numéro de série: 3000105704

(01)00843997013703(11)210601(10)54gp75P(17)230601(21)3000105704
(01)00843997013703(11)210601(10)54gp75P(17)230601(21)3000105704
(01) GTIN de l’article: 00843997013703
(11) Date de production: 210601
(10) Numéro de lot: 54gp75P
(17) Date d'expiration : 230601
(21) Numéro de série: 3000105704

]C1010088387386779211220707172307071022070721PC22412085
(01)00883873867792(11)220707(17)230707(10)220707(21)PC22412085
(01) GTIN de l’article: 00883873867792
(11) Date de production: 220707
(17) Date d'expiration : 230707
(10) Numéro de lot: 220707
(21) Numéro de série: PC22412085


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

Très prometteur, et quelle réflexion, je suis admiratif!

Avec ces codes :

codes = Array("(01)00843997013703(11)210601(17)230601(21)3000105704", "0109420012422286102101744203GS1121080421210804297823", "01076132030327041123090621800037578", "0107332414124359210000107668GS11210208")

J'obtiens:

(01)00843997013703(11)210601(17)230601(21)3000105704
(01)00843997013703(11)210601(17)230601(21)3000105704
(01) GTIN de l’article: 00843997013703
(11) Date de production: 210601
(17) Date d'expiration : 230601
(21) Numéro de série: 3000105704

0109420012422286102101744203GS1121080421210804297823
Erreur data imprévue
(01)09420012422286
(01) GTIN de l’article: 09420012422286

01076132030327041123090621800037578
(01)07613203032704(11)230906(21)800037578
(01) GTIN de l’article: 07613203032704
(11) Date de production: 230906
(21) Numéro de série: 800037578

0107332414124359210000107668GS11210208
(01)07332414124359(21)0000107668GS11210208
(01) GTIN de l’article: 07332414124359
(21) Numéro de série: 0000107668GS11210208

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 23:54

Avec celui là 0109420012422286102101744203GS1121080421210804297823

c'est normal, tu m'as dit qu'il n'y avait pas de GS en texte, donc je n'en tiens plus compte.


0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
29 oct. 2023 à 23:54

idem

0107332414124359210000107668GS11210208

0
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 à 00:09

OUPS plus de GS, je n'avais pas compris

Sur ton poste #85, tu écris:
Dans lequel, d'une part GS n'apparait plus en texte mais \x21,

Ce n'est pas \x21, mais \x1d.

C'est OK

(01)00843997013703(11)210601(17)230601(21)3000105704
(01)00843997013703(11)210601(17)230601(21)3000105704
(01) GTIN de l’article: 00843997013703
(11) Date de production: 210601
(17) Date d'expiration : 230601
(21) Numéro de série: 3000105704

0109420012422286102101744203GS1121080421210804297823
(01)09420012422286(10)2101744203(11)210804(21)210804297823
(01) GTIN de l’article: 09420012422286
(10) Numéro de lot: 2101744203
(11) Date de production: 210804
(21) Numéro de série: 210804297823

01076132030327041123090621800037578
(01)07613203032704(11)230906(21)800037578
(01) GTIN de l’article: 07613203032704
(11) Date de production: 230906
(21) Numéro de série: 800037578

0107332414124359210000107668GS11210208
(01)07332414124359(21)0000107668(11)210208
(01) GTIN de l’article: 07332414124359
(21) Numéro de série: 0000107668
(11) Date de production: 210208

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

Ce n'est pas \x21, mais \x1d.

Ha oui faute de frappe, c'est \x1d qui sert de borne dans les regex.

En plus G et S sont des caractères autorisés donc la possibilité qu'ils se retrouvent à la suite dans une description existe.

Pour les descriptions à longueur fixe, même si fnc1 est requis, tu peux le laisser optionnel, (c'est peut-être le cas de certains dans ton groupe 13, j'ai pas vérifié les 300 lignes) la regex s'arrêtera à la taille fixe et consommera le \xd1 ou la parenthèse s'ils sont présents.

Pour cette façon de faire, il est nécessaire que l'AI soit dans un groupe de capture et la description dans le second. Sachant que l'AI peut être entouré de parenthèses et que celles-ci ne doivent pas être dans le groupe.


0
Rejoignez-nous