[perl] Problème expression régulière

Fermé
the pit - 2 avril 2008 à 12:23
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 2 avril 2008 à 17:32
Bonjour,

J'ai un petit problème avec une expression régulière pour détecter une chaine de caractère.
J'utilise le langage Perl.

Voilà je cherche à détecter des déclarations de tableaux, j'ai donc codé ceci:

if ($Data =~ /[ \t]*typedef[ \t]*([0-9a-zA-Z_]+)[ \t]*([0-9a-zA-Z_]+)[ \t]*\[[ \t]*([0-9a-zA-Z_]+)[ \t]*\][ \t]*;/)
{
...
}

Mon problème vient du fait que ça ne marche pas pour la déclaration suivante:
typedef T_RB_MODE T_DL_HS_URLC_MODE_CT_LIST [MAX_NOF_DL_HS_URLC_MODE_CT_LIST];
alors que pour celle ci ça marche:
typedef T_DL_HS_PDU_SIZE_DESCR T_DL_HS_PDU_SIZE_LIST[MAX_NOF_DL_HS_PDU_SIZE_ENTRIES];

En regardant bien, la seule différence c'est l'espace avant le crochet ouvrant.
Pourtant c'est géré dans l'expression régulière.

Si quelqu'un a déjà eu le problème.
Merci de m'aider.
A voir également:

5 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 avril 2008 à 12:39
Salut,

je pense que tu compliques ta regex

2 lignes d'exemple ne suffisent pas pour voir la généralité de ton problème

root@debian:~# cat fic
typedef T_RB_MODE T_DL_HS_URLC_MODE_CT_LIST [MAX_NOF_DL_HS_URLC_MODE_CT_LIST];
typedef aaaa;
typedef T_DL_HS_PDU_SIZE_DESCR T_DL_HS_PDU_SIZE_LIST[MAX_NOF_DL_HS_PDU_SIZE_ENTRIES];
n'importe quoi
root@debian:~# perl -ne 'print if /^typedef/' fic
typedef T_RB_MODE T_DL_HS_URLC_MODE_CT_LIST [MAX_NOF_DL_HS_URLC_MODE_CT_LIST];
typedef aaaa;
typedef T_DL_HS_PDU_SIZE_DESCR T_DL_HS_PDU_SIZE_LIST[MAX_NOF_DL_HS_PDU_SIZE_ENTRIES];
root@debian:~# perl -ne 'print if /^typedef.*\ [ [ ^  \ ] ] + \ ] ; /' fic
typedef T_RB_MODE T_DL_HS_URLC_MODE_CT_LIST [MAX_NOF_DL_HS_URLC_MODE_CT_LIST];
typedef T_DL_HS_PDU_SIZE_DESCR T_DL_HS_PDU_SIZE_LIST[MAX_NOF_DL_HS_PDU_SIZE_ENTRIES];
root@debian:~#

A enlever les espace que j'ai mis dans la regex

il y a des problèmes avec les balises






0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 avril 2008 à 12:53
un essaie avec code html

perl -ne 'print if /^typedef.*\[[^\]]+\]/' fic
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 avril 2008 à 12:53
le message 2 est correct
0
Merci pour les réponses.

Je suis obligé de compliquer la regexp car je dois capturer le type, la variable ainsi que la taille comme ceci:

typedef TYPE VAR[SIZE]; --> ça passe
typedef TYPE VAR [SIZE]; --> ça ne passe pas
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 avril 2008 à 14:01
tu dois savoir que pour écrire une regex on a besoin de 2 choses

le fichier à traiter
ce qu'on veut obtenir

pour l'instant ce que tu demandes c'est trop général
je pourrai t'aider à condition que tu soit plus explicite
merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 avril 2008 à 17:32
Voici un exemple un peu mieux
:~$ cat the_pit
typedef T_RB_MODE T_DL_HS_URLC_MODE_CT_LIST [MAX_NOF_DL_HS_URLC_MODE_CT_LIST];
alors que pour celle ci ça marche;
typedef T_DL_HS_PDU_SIZE_DESCR T_DL_HS_PDU_SIZE_LIST[MAX_NOF_DL_HS_PDU_SIZE_ENTRIES];
typedef TYPE VAR[SIZE]; --> ça passe
typedef TYPE VAR [SIZE]; --> ça ne passe pas
:~$ perl -ne 'next unless /^typedef\s+(.*?)\s+(.*?)\s*\[([^\]]+)\]/; print "\ntype=$1\nnom=$2\ntaille=$3\n\n"' the_pit

type=T_RB_MODE
nom=T_DL_HS_URLC_MODE_CT_LIST
taille=MAX_NOF_DL_HS_URLC_MODE_CT_LIST


type=T_DL_HS_PDU_SIZE_DESCR
nom=T_DL_HS_PDU_SIZE_LIST
taille=MAX_NOF_DL_HS_PDU_SIZE_ENTRIES


type=TYPE
nom=VAR
taille=SIZE


type=TYPE
nom=VAR
taille=SIZE

:~$

0