Bonjour,
Je ne sais si je dois poster dans le forum dédié regex php ou celui-ci, car ma question est générale mais plutôt VB.net
Je dois parcourir un fichier gedcom (standard d'échange pour les généalogistes) dont voici un extrait où je dois extraire des lieux de naissance et/ou décès :
0 @1I@ INDI
1 NAME Elisabeth/TOTO/
1 SEX F
1 BIRT
2 TYPE Naissance
2 DATE 18 JUL 1816
2 PLAC ville1 test
1 DEAT
2 TYPE Décès
2 DATE 18 JUL 1816
2 PLAC ville 2
1 CHAN
2 DATE 19 APR 2004
il me faut trouver une expression qui capture le lieu de naissance (ville1 test) et une autre similaire qui extrait le lieu de décès (ville 2). L'ennui est que d'un individu à l'autre, on peut avoir deux lieux comme dans l'exemple, ou un seul lieu, ou 0 lieu (quand il n'y a pas de lieu, il n'y a pas la ligne). J'ai trouvé plusieurs formules d'expression qui trouvent le lieu quand il n'y en a qu'un seul, mais je ne trouve pas la bonne expression qui donne un lieu de naissance, vide, quand il n'y a pas la ligne idoine, car s'il y a le lieu de décès et point celui de naissance, mon expression capture la date de décès comme étant la date de naissance (mais quand même l'autre expression de décès capture bien la date de décès!)
L'expression que j'ai trouvée est
(?:1 BIRT[\w\W]+?2 PLAC\s+)([^$]+?)\s*$
avec les options ignorecase et multiline
en outre, bien que cette expression trouve le lieu de naissance (quand il y est) en testant sur les sites regex101.com et www.myregextester.com, avec mon programme en vb 2010, ça attrape toujours le lieu de décès!
Je cherche une solution avec un lookbehind qui voudrait interdire de prendre une ligne 2 PLAC si elle est précédée d'une ligne 1 DEAT mais celle ci-après ne fonctionne pas :
(?:1 birt[\w\W]+?(?<!1 deat)[\w\W]+?2 plac\s+)([^$]+?)$
Donc, j'aurai besoin de quelques lumières ou solution svp.
Merci par avance
Partager