Salut!
J'ai une chaine du genre : file.h "long file name.h" (cd config.tests/unix/stl && $(MAKE) distclean); $(DEL_FILE) .qmake.cache
et je voudrai obtenir :
file.h
long file name.h
(cd config.tests/unix/stl && $(MAKE) distclean);
$(DEL_FILE)
.qmake.cache
J'utilise ([^ \"]+)|\"(.*)\"|(\(.*\);?) mais ça ne marche pas, ça me lie (cd config.tests/unix/stl && $(MAKE) distclean); avec $(DEL_FILE).
Je précise aussi que (cd config.tests/unix/stl && $(MAKE) distclean); peut ne pas aveoir de ; à la fin (sinon j'aurai pu faire ([^ \"]+)|\"(.*)\"|(\(.*\); )
Qui a une idée?
Zeph Le 16/05/2007 à 21:19 oula, le problème c'est que si tu veux un truc un minimum générique, c'est pas avec des regexp que tu vas t'en sortir, la grammaire d'un shell est trop complexe :/
enfin je ne sais pas exactement dans quel but tu veux faire ça, mais dans ton exemple c'est normal que ça réagisse comme ça puisque le "\(.*\)" essaie de matcher la plus grande chaine possible, et comme il n'y a pas moyen de compter les parenthèses en regexp, tu ne pourras pas lui dire exactement à laquelle tu veux t'arrêter.

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
kim Le 17/05/2007 à 19:59 • kim confirme.
Le problème c'est qu'il faut pouvoir compter les parenthèses, et une regexp normale ne sait pas faire ça.

Il n'a pas de mots
Décrire son mépris
Perdre les rênes
Il a perdu la foi
Ouép, ce que tu cherches à faire ne correspond pas à une grammaire régulière. Il n'existe donc pas d'expression régulière la décrivant.
Les trucs de perl, c'est plus des expressions régulières, c'est un abus de langage qu'on utilise à cause de l'analogie de syntaxe, et du fait que ce soit un surensemble des expressions régulières ^^
Avec un automate Flex, il me semble que ce soit aussi possible (regexps+contextes).