Regexp pour trouver certaines chaînes - Codes et scripts - Linux et OS Alternatifs
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...
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
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...
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é |
faut aller voir ailleurs monsieur, c'est plus possible maintenant (genre poser ta question sur la catégorie windows et/ou prog )
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.
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. |
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 ), 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 ...)
Marsh Posté le 10-04-2008 à 14:27:20
nimrod_182 a écrit : |
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 : |
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.
Marsh Posté le 10-04-2008 à 14:51:28
Super pour la première réponse, merci !
Pour le deuxième truc effectivement la solution que j'ai trouvée avec ?! marche.
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. |
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).
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 !