Rechercher : dans
Par :

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

Dernière réponse le 2 avr 2008 à 17:32:36 the pit, le 2 avr 2008 à 12:23:19 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Firefox 2.0.0.13

Meilleures réponses pour « [perl] Problème expression régulière » dans :
[RegExp] Récupérer une adresse IP VoirFinalité Mise en œuvre Explications Interprétation du motif Récupérer une adresse IP Finalité Pour récupérer une IP dans un fichier texte, fichiers journaux, pages web, etc. Mise en œuvre L'expression régulière suivante combinée à la...
Google - Recherche d'une expression exacte VoirLorsque l’on souhaite faire la recherche d’une expression exacte, il suffit de mettre cette expression entre guillemets. Exemple : "animal domestique" référencera uniquement les sites comportant l’expression "animal domestique".
Télécharger Renamer4Mac VoirRenamer4Mac permet de renommer facilement un grand nombre de fichiers. Par un simple glisser/déposer des fichiers sur son icône ou dans sa fenêtre, on peut agir de différentes manières. par Rechercher/Remplacer (expression régulière et...
PHP - Expressions régulières VoirQu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...
Javascript - L'objet RegExp VoirLes particularités de l'objet RegExp L'objet RegExp est un objet permettant de manipuler des expressions régulières, c'est-à-dire des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver des...

1

lami20j, le 2 avr 2008 à 12:39:25

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






106485010510997108

Répondre à lami20j

2

lami20j, le 2 avr 2008 à 12:53:22

Un essaie avec code html

perl -ne 'print if /^typedef.*\[[^\]]+\]/' fic
106485010510997108

Répondre à lami20j

3

lami20j, le 2 avr 2008 à 12:53:50

Le message 2 est correct 106485010510997108

Répondre à lami20j

4

the pit, le 2 avr 2008 à 13:31:50

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

Répondre à the pit

5

lami20j, le 2 avr 2008 à 14:01:45

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 106485010510997108

Répondre à lami20j

6

 lami20j, le 2 avr 2008 à 17:32:36

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

:~$

106485010510997108

Répondre à lami20j