Regexp pour trouver certaines chaînes

Regexp pour trouver certaines chaînes - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 10-04-2008 à 13:22:27    

Je débute avec les expressions régulières et je galère un peu.
Je voudrais remplacer les chaînes de caractères d'un projet : "blabla" par fonction("blabla" ).
Je ne veux pas remplacer les lignes qui commencent par '#include'.
Je ne veux pas remplacer les chaînes déjà remplacées.
 
Voilà où j'en suis :
"[^"]*" pour ne prendre deux chaînes sur la même ligne comme une seule, mais je voudrais que ça ne coupe pas quand on rencontre \" dans la chaîne.
^(?:[^i]|i(?!nclude))*$ me donne toutes les lignes qui ne commencent pas par un '#include', mais je sais pas comment la combiner avec l'expression précédente
ensuite je voudrais non seulement ne pas prendre les chaînes précédées par '#include' mais aussi les chaînes précédées par 'fonction('.
 
Merci !  :hello:

Reply

Marsh Posté le 10-04-2008 à 13:22:27   

Reply

Marsh Posté le 10-04-2008 à 13:40:28    

Tu fais ça avec quoi ?  perl ? awk ? sed ?
 
Perso, je ferais ça avec un script perl tout bête, qui commencerait par recopier telles quelles les lignes commençant par #include, puis ferait la substitution dans les autres.
N'hésite pas à demander si tu veux plus de précisions...


---------------
TriScale innov
Reply

Marsh Posté le 10-04-2008 à 13:50:14    

au début je voulais juste le faire avec le find/replace de visual studio mais apparemment il est limité
je pensais le faire avec PowerGrep, un programme que j'ai trouvé (15j gratuits) qui est une grep avec interface graphique

Reply

Marsh Posté le 10-04-2008 à 13:59:11    

OK. Alors deux choses :
1- tu t'es trompé de catégorie : va plutôt voir du côté de la catégorie "Windows et Softwares"
2- j'ai l'impression qu'avec powergrep tu es obligé de tout mettre dans une seule regexp, et ça risque d'être un peu difficile pour faire ce que tu veux. Tu peux peut-être regarder ici pour avoir quelques idées de départ. En gros, la technique consiste à faire un "negative lookahead" pour éliminer les lignes #include, tout en matchant quand même correctement les autres...


---------------
TriScale innov
Reply

Marsh Posté le 10-04-2008 à 13:59:18    

nimrod_182 a écrit :

au début je voulais juste le faire avec le find/replace de visual studio mais apparemment il est limité
je pensais le faire avec PowerGrep, un programme que j'ai trouvé (15j gratuits) qui est une grep avec interface graphique


[:blessure]
 
faut aller voir ailleurs monsieur, c'est plus possible maintenant :o (genre poser ta question sur la catégorie windows et/ou prog :D)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 10-04-2008 à 14:02:13    

Désolé après avoir fait une recherche c'est là que j'avais trouvé d'autres questions sur le sujet.
Après tout peu importe l'environnement la question porte sur les expressions régulières.

Message cité 2 fois
Message édité par nimrod_182 le 10-04-2008 à 14:02:41
Reply

Marsh Posté le 10-04-2008 à 14:05:21    

nimrod_182 a écrit :

Désolé après avoir fait une recherche c'est là que j'avais trouvé d'autres questions sur le sujet.
Après tout peu importe l'environnement la question porte sur les expressions régulières.


oui mais non, car sous linux il y a tous les outils "nécessaires et suffisants" pour ce genre de travail (on va même dire que tu n'as que l'embarras du choix :D), alors que sous windows tu es obligé d'aller chercher des softs pas forcément très pratiques et qui ne vont pas vouloir accepter ce qu'on va te proposer :/ (la preuve ...)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 10-04-2008 à 14:27:20    

nimrod_182 a écrit :


[...]
je voudrais que ça ne coupe pas quand on rencontre \" dans la chaîne.


 
Tu as écrit :  
" : "
suivi de [pas "] le plus de fois possible :   [^"]*
suivi de " : "
Soit : "[^"]"
 
Or tu voudrais tolérer la suite \", tu veux donc :
" : "
suivi de :  
[pas "] : [^"]
OU : |
de la suite \" : [\"]    (je mets des [] ici pour le \, sinon faudrait l'écrire \\ sans les crochets)
toujours le plus de fois possible : *    
Soit : "([^"]|[\"])*"
 

nimrod_182 a écrit :


^(?:[^i]|i(?!nclude))*$ me donne toutes les lignes qui ne commencent pas par un '#include', mais je sais pas comment la combiner avec l'expression précédente


Nier un mot c'est jamais simple avec les regexp.
Si tu cherches "pas #include" suivi d'un truc particulier, ca fait un truc du genre :  
^([^#]|#[^i]|#i[^n]|#in[^c]|#inc[^l]|#incl[^u]|#inclu[^d]|#includ[^e])*un_truc_particulier$
 
Mais tu as l'air d'avoir accès à quelques trucs supplémentaires comme ?!, tant mieux.
 :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 10-04-2008 à 14:51:28    

Super pour la première réponse, merci !  :bounce:  
Pour le deuxième truc effectivement la solution que j'ai trouvée avec ?! marche.

Reply

Marsh Posté le 10-04-2008 à 14:58:30    

nimrod_182 a écrit :

Désolé après avoir fait une recherche c'est là que j'avais trouvé d'autres questions sur le sujet.
Après tout peu importe l'environnement la question porte sur les expressions régulières.


ouai enfin, tu le veux mettre en pratique je suppose, non ?
Dans ce cas il est vivement conseillé de poster dans la catégorie créée pour ton environnement...

 

Tant que le sujet reste dans le cadre des expressions régulières qu'on peut trouver sous les UNIX et assimilés, je laisse ouvert, si ca dérape sur la pratique dans un environnement windows je fermerai ce topic. (et pour les trolls y aura une gâterie en plus).


Message édité par o'gure le 10-04-2008 à 14:58:54

---------------
Relax. Take a deep breath !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed