Recherche type contient dans plusieurs zone de taille fixe [Résolu]

Signaler
Messages postés
32
Date d'inscription
mardi 15 janvier 2002
Statut
Membre
Dernière intervention
24 mars 2011
-
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjour,
je cherche a faire une reg exp permettant de chercher dans une chaine composée de plusieurs zones de taille fixe dont la longueur et la position sont connues, une ou plusieurs valeurs.

La / Les valeur fournit n'est pas forcément complète, on fait donc une recherche de type contient dans chaque zone.

Exemples de chaine à analyser:
0123456789DurandxxxxxxxxxxxxxxJeanxxxxxxxxxxxxxxxx01234567890123456789012345
OU
0123456789xxxxxxDurandxxxxxxxxxxxxJeanxxxxxxxxxxxx01234567890123456789012345
OU
0123456789xxxxxxxxxxxxxxDurandxxxxxxxxxxxxxxxxJean01234567890123456789012345
...


La zone contenant le nom est sur 20 caractères et commence à la position 11.
La zone contenant le prénom est sur 20 caractères et commence à la position 31.

Si on cherche une seule des 2 zones, par exemple le prénom. Je génère cette expression:
.{30}.{0,16}Jean
On se place à la position 31 et on fait un match si l'expression contient 0 à 16 caractères quelconque suivi du prénom Jean.
Pas de problème avec cette expression. Ca permet de trouver la valeur Jean n'importe où dans la zone.

Maintenant, si je dois chercher nom et prénom, l'expression générée est:
(.){10}.{0,14}Durand.{0,16}Jean
or dans la 1ere ligne d'exemple, Durand n'est pas préfixé par des espaces mais suffixé. On trouve donc le nom directement, préfixé par 0 espace.
La reg exp ne match pas car on cherche le prénom au mauvais endroit.

J'ai eu plusieurs piste pour solutionner ce problème mais pour l'instant, je n'ai pas trouvé de solution qui fonctionne dans tous les cas.

Pour info, la reg exp sera générée par code.

J'espère que l'un d'entre vous pourra m'aider.

6 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
sur, si tu change l'énoncé ^^

possible de mentionner tous les champs :

^.{5}.{10}(?:\s*Durand\s*).{40}.{80}.{5}.{10}(?:\s*Jean\s*).{40}.{80}$


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Je pense assertion :

^.{10}(?=\s*Durand\s*Jean[\s\d]).{40}

0123456789Durand              Jean                01234567890123456789012345
0123456789      Durand            Jean            01234567890123456789012345
0123456789              Durand                Jean01234567890123456789012345
0123456789          DurandJean                    01234567890123456789012345



0123456789          DurandJean0123456789012345678901234567890123456789012345
0123456789               Durand                Jea01234567890123456789012345
0123456789               Duran                Jean01234567890123456789012345
0123456789            odurand            Jean     01234567890123456789012345
0123456789      Durand            Jeanne          01234567890123456789012345


la construction ?= permet de définir une condition. Si cette condition est remplie, l'expression suivante est testée.

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
32
Date d'inscription
mardi 15 janvier 2002
Statut
Membre
Dernière intervention
24 mars 2011

Merci, ca à l'air intéressant. Je vais faire quelque recherche pour comprendre un peu plus comment marche le ?= car ta solution ne résout pas complètement mon problème, les 2 zones de recherche pouvant ne pas être contigue. J'aimerai pouvoir faire des recherches sur des zones bien délimitées (les zones nom et prénom étant des exemples).

Par exemple, la ligne serait composée de 10 zones dont les longueurs sont respectivement 5 10 20 40 80 5 10 20 40 80

Le problème à résoudre: Comment chercher la valeur Durand dans la zone 3 et Jean dans la zone 8 et uniquement dans ces zones, la valeur étant à chercher dans l'intégralité de la zone, soit du 20 caractères ?
Messages postés
32
Date d'inscription
mardi 15 janvier 2002
Statut
Membre
Dernière intervention
24 mars 2011

Je n'avais pas tout compris mais c'est bien ce qu'il faut utiliser, ta solution est valable.

En fait, il faut que je l'utilise par zone. Si je reprend l'exemple du post précédent, je dois générer cette expression:
^(.{15}(?=.{0,14}Durand).{20}.{135}(?=.{0,16}Jean).{20})$

Merci beaucoup
Messages postés
32
Date d'inscription
mardi 15 janvier 2002
Statut
Membre
Dernière intervention
24 mars 2011

tu es rapide, je n'avais pas raffraichi la page avant de répondre à mon post ;)
Encore merci
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Au final, la taille fixe des champs entourant, ainsi que l'utilisation de

^ et $

nous permet de nous passer de la taille de 20 de nos champs.
on colle aux deux bords, so...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp