URL: https://linuxfr.org/forums/programmation-perl/posts/regexp-en-folie Title: regexp en folie Authors: Ontologia Date: 2005年03月29日T17:36:17+02:00 Tags: Score: 0 Engagé dans mon entreprise de réaliser un script transformant quelques séquences de langage C en langage lisaac, j'ai développé mon premier programme perl à cette fin. Globalement ça marche moyennant quelques problèmes. Je sais, je ferai mieux d'utiliser un parser, mais je n'ai que peu de temps à y consacrer et de toutes façon on cherche juste à transformer quelques expression (inverser des if, transformer des = en :=, tranformer des tab[5][8][xio45] en tab.item 5,8,xio45, etc..). Bref juste les trucs chiants. Les deux langages étant trop différentes on ne cherche pas à aller plus loin (Lisaac est un langage objet sans pointeurs). Bref, je prend un cas au hasard : if ((BlockSAD[list][i][j] = (int**)malloc (16 * sizeof(int*))) == NULL) Afin de détecter ce genre de joyeuseté (ya bien pire) j'ai ma regexp : \s*(if)+\s*(\(){1}\s*([\[\]\-|!'\\=\+,<>\s\.\*\/<>{}()&\w\?\:]*)(\)){1}\s*([\[\]\-|!'\\=\+,<>\s\.\*\/<>{}()&\w\?\:]*);* ( pr la petite histoire j'applique ensuite un : print '( '.3ドル.' ).if '.5ドル; pour inverser le if, ce qui donne : "((BlockSAD[list][i][j] = (int**)malloc (16 * sizeof(int*))) == NULL).if" ) Le problème est aussi de transformer BlockSAD[list][i][j] en BlockSAD.item list,i,j Pour cela j'ai bien ma regexp qui me détecte les expressions de ce genre ([\w]+)\s*(([\[]+)\s*([\w\.-<>\s\(\)\+\*\/]*)\s*([\]]+)+) puis adaptée à la taille \s*([\w_\.]+)\s*\[([\w_\.]+)\]\s*\[([\w_\.]+)\]\s*\[([\w_\.]+)\];* ou je fait un : print 1ドル.'.item '.2,ドル','.3ドル.','.4ドル.' '; Le problème c'est que faisant, je vire toute la ligne, alors que j'aimerai ne remplacer que cette séquence et rien d'autres. Quel solutions, à part refaire une regexp pour récupérer le "n'importe quoi" avant et après (ie. "if (( " et = "(int**)malloc (16 * sizeof(int*))) == NULL)" et de pouvoir caller proprement mon print 1ドル.'.item '.2,ドル','.3ドル.','.4ドル.' '; à l'intérieur afin d'avoir if ((BlockSAD[list][i][j] = (int**)malloc (16 * sizeof(int*))) == NULL) transformé en ((BlockSAD.item list,i,j = (int**)malloc (16 * sizeof(int*))) == NULL) .if ? J'espère que vous avez suivi !

AltStyle によって変換されたページ (->オリジナル) /