|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : octobre 2007 Messages : 6 ![]() |
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. |
|
|
00
|
|
|
#2 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Une regexp de cette forme devrait permettre d'extraire les deux données qui t'intéressent de la chaine:
Code :
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||
|
00
|
|
|
#3 | ||
![]() ![]() Benjamin PREVOTArchitecte de système d'information Inscription : septembre 2004 Messages : 1 568 ![]() |
Bonjour,
Puisque tu connais la longueur du champ et sa position, pourquoi ne pas utiliser les fonctions substr et strpos plutôt que les expressions régulières ? Code :
Bon développement
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN F.A.Q. : Java, PHP, (X)HTML / CSS N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème |
||
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : octobre 2007 Messages : 6 ![]() |
Merci pour ces réponses.
@Benjamin Delespierre Ton expression est correcte pour l'exemple que je donne mais dans la majorité des cas rééls de mon application, les 2 zones ne se suivent pas. Voici un autre exemple plus réaliste: Citation:
et x représente le contenu des zones de recherche qui ne correspondent pas à la valeur recherchée (exemple pour le prénom, si on cherche Jean et qu'on a Jean Michel dans la zone, on doit quand même afficher le résultat. @Nesmontou En fait, en début de conception, la question s'est posée mais on a choisi de travailler avec les expressions régulières car: - elles sont faites pour faire des recherches optimisées sur du texte - elles permettaient d'industrialiser en grande partie le code, en créant une fabrique de reg exp en fonction des critères de recherche (et donc de limiter la taille du code => le temps) On a réussi à gérer tous nos cas via les reg exp, y compris un cas de recherche d'absence de données (en gros, la reg exp match le complément de ce qui a été trouvé. Ex simpliste: on cherche toutes les personnes dont le prénom n'est pas Pierre.). Reste ce dernier cas imparfait que nous gérons avec l'expression ci dessous. On va poser les bases suivantes: La zone nom se trouve en position 31 à partir du début de ligne et fait 20 caracteres. La zone prénom se trouve en position 59 (59-31 = 28) à partir du début de ligne et fait 20 caracteres. Si on cherche Durand (6 caracteres) Jean (4 caractères) L'expression générée par notre appli est: Citation:
(.){0,14}Durand: permet de chercher parmis les 20 caracteres de la zone la valeur Durand (.){22,38}Jean: permet de chercher à partir de la position 59 (31+6+22) à 75 (31+6+38) la valeur Jean (.)+$: ramene le reste de la ligne. Concrètement, cela fonctionne mais si dans la zone nom on a comme valeur "Durand Jean " et dans la zone prénom on a "Michel ", la reg exp matchera, ce qui ne devrait pas être le cas. Je n'arrive pas à trouver l'astuce qui me permettrait de matcher uniquement quand on a les 2 valeurs recherchées précisément dans leur zone. |
||
|
|
00
|
|
|
#5 | |||
![]() ![]() Benjamin PREVOTArchitecte de système d'information Inscription : septembre 2004 Messages : 1 568 ![]() |
Bonsoir,
Sinon, je ne comprends l'avantage de générer des expressions régulières (temps de calcul de la regex...) par rapport à la méthode que je t'indiquais
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN F.A.Q. : Java, PHP, (X)HTML / CSS N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème |
|||
|
|
00
|
|
|
#6 | |
|
Invité de passage
![]() Inscription : octobre 2007 Messages : 6 ![]() |
Citation:
Avez vous des pistes de résolution à me proposer ? |
|
|
|
00
|
|
|
#7 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
Citation:
D'ici, je pense que la regexp "^(.){30}(.){0,14}Durand(.){22,36}Jean(.)+$" peut être réduite à: "Durand.*Jean" tout simplement.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Inscription : octobre 2007 Messages : 6 ![]() |
On m'a donné la solution sur un autre forum:
Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com