1

Je galère depuis plusieurs heures pour trouver une expression régulière que me permettra d'extraire un champ dans un texte structuré par champs, séparés par un caractère de séparation et enveloppés par un caractère d'enveloppement.
Par exemple, les lignes de texte suivantes sont des lignes utilisant ';' comme séparateur, '"' comme enveloppeur et '\' comme caractère d'échappement (pour qu'un champ puisse contenir le caractère de séparation ou d'enveloppement) :
"123";"Texte";"J'aime les truites ; les saumons et les \"humains\"."
"456";"BlaBla";"Une choucroute ça mange des routes"


Mon but est d'écrire une fonction get_field($line,$n,$delim,$env,$echap) qui retourne le champ n° $n d'une ligne de texte $line dont les champs sont séparés par $delim et enveloppés par $env, en utilisant le caractère $echap comme caractère d'échappement.
st d'ailleurs sont comportement par défaut), par exemple :123;Texte;J'aime les truites \; les saumons et les "humains"Le caractère d'enveloppement peut être nul (chaine vide, c'e
En prenant ce même texte comme paramètre $line, l'appel get_field($line,2,';','\'); renverra la chaine de caractères "Texte".

J'utilise la fonction ereg pour extraire le contenu du champ à partir d'une simple expression régulière, mais je ne parviens pas à l'écrire correctement.
Pour l'instant, sans gérer le caractère d'échappement, je suis arrivé à ça :
$pattern = "(".$env."([^".$delim."]*)".$env."[".$delim."\n\$]){".($n+1)."}";
Mais le fait qu'à la fin d'une ligne le caractère délimiteur n'ait pas besoin d'être présent (dans ce cas, la fin du champ est marquée par la fin de la ligne) pose des problèmes. Et de toute façon comme le caractère d'echappement n'est pas géré ça n'est pas complet, et toutes mes tentatives de le gérer ont été des échecs.

Donc j'aimerais savoir si qq1 a un meilleur pattern à proposer parce que je commence à m'arracher les cheveux.
Merci.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

2

ec des délimiteurs non vides en tous cas, sinon j'en sais rien) : (("([\].|[^\"])*("|$)|[^";])*;){2}(("([\].|[^\"])*("|$)|[^";])*)Ceci doit normalement sélectionner le 3ème champ d'une ligne (avBon, je te souhaite bonne chance pour la construire en perl gni
[edit : erreur de copie]

3

|[^$esc$env])*($env|$)|[^$env$del])*)"En perl ça doit donner qqc comme ça : "(($env([$esc].|[^$esc$env])*($env|$)|[^$env$del])*;){2}(($env([$esc].
Vérifie quand même, parce que les $ tous seuls (ceux devant une ) je sais pas comment ils vont être interpretés par perl.

4

Ancien pseudo : lolo

5

En général pour les regexps un peu compliquées je dessinne l'automate de la grammaire correspondante.

6

Il me faudrait vraiment un cours complêt sur les ereg, c'est quelque chose que je n'ai pas du tout dans ma culture (dsl du up)... si à un open quelqu'un veut m'expliquer les bases et me faire faire qqes exos, je suis partant.
avatar

7

Oué ça peut se faire. Essaie de dire avant quel niveau de compréhension que tu en veux.
Ca peut aller de "comprendre ce que c'est" (ça c'est assez vite fait) à "connaitre toute la théorie concernant les grammaires et les automates" (là y'en a pour plusieurs jours) en passant par "savoir lire, écrire et utiliser les expressions régulières" (normalement c'est l'affaire de quelques heures)

8

Hum j'ai déjà fait des automates et de la grammaire en info à l'IUT, donc ça va... après, c'est plutôt la dernière possibilité qui m'intéresse : savoir lire, écrire et utiliser.
avatar

9

Pollux se fera sûrement une joie de t'aider smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

10

love
Je sens que c'est vraiment le genre de truc qui permet d'éviter les tests en cascade (par contre, pour la lisibilité du code, il faut que les personnes qui suivent le développement connaissent aussi, sinon j'imagine pas cheeky)
avatar

11

./9> pk moi ? confus

Sinon, bah RTFM tongue http://www.perl.com/doc/manual/html/pod/perlre.html
Les syntaxes de regexp varient légerement selon le logiciel que tu comptes utiliser, les regexp type Perl sont sans doute les plus puissantes et les plus répandues (on peut juste pas faire de look-behind de longueur variable sad alors qu'avec vim on peut ^^)
Mais bon le plus simple c'est de partir d'exemples concrets et de nous dire ou tu bloques/tu penses qu'il y a une meilleure solution smile

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

12

Ben en fait, j'ai eu juste une fois à faire une application très simple (il fallait que la variable saisie soit un alphanumérique pur sans accents), donc un chtit tour sur Internet et j'ai trouvé ce que j'ai vu... mais bon, j'aimerais faire quelques exercices corrigés avec qq'un qui me guide, comme à l'école, quoi... Parce que j'ai un gros bouquin sur la maîtrise des expressions régulières, au boulot, mais bon, il me faudrait déjà les bases.
avatar

13

Pollux> Parce que j'ai l'impression que tu aimes bien manipuler des expressions régulières.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »