Bonjour, J'ai un cours d'administration d'unix en ce moment, et j'ai une question concernant les expressions regulieres (que je pourrais poser au formateur, mais je ne suis pas sur d'obtenir une reponse satisfaisante, en plus de ne pas avoir d'avis contradictoire). En bref, dans le poly de cours, il est marque : " Soit la regexp ^[^abc]* Soit un fichier contenant : ascenseur chameau berceau elephant la regexp selectionne toutes les lignes, a cause du principe de rendre muette une contrainte pour satisfaire la regexp globalement " J'ai cherche un peu pour trouver que finalement une regexp faisant ce qu'on lui demande (enfin ce que je crois etre le but de cette regexp : ne trouver que elephant) serait ^[^abc][a-z]* Mon impression est donc plutot que l'utilisation de l'etoile est mauvaise (mal placee) La question est donc : quel est ce principe de "rendre muette une contrainte pour satisfaire une regexp" ? Est-ce justifie dans ce contexte (ou ce que j'en ai compris) ? Merci pour votre aide ! Jeremy
On 2005-10-24 18:05:43 +0200, Jeremy Monnet wrote:
En bref, dans le poly de cours, il est marque : " Soit la regexp ^[^abc]*
Soit un fichier contenant : ascenseur chameau berceau elephant
la regexp selectionne toutes les lignes, a cause du principe de rendre muette une contrainte pour satisfaire la regexp globalement "
J'ai cherche un peu pour trouver que finalement une regexp faisant ce qu'on lui demande (enfin ce que je crois etre le but de cette regexp : ne trouver que elephant) serait ^[^abc][a-z]* Mon impression est donc plutot que l'utilisation de l'etoile est mauvaise (mal placee)
En fait, il y a généralement deux contextes possibles, suivant les applications: 1) soit une regexp doit matcher toute une ligne (ou toute une chaîne), 2) soit elle peut matcher une partie de la ligne (ou chaîne) seulement. En général, on est dans le cas 2, et on utilise ^ et/ou $ pour matcher le début et/ou fin de la ligne. Mais alors, teminer sa regexp par une sous-expression étoilée ne sert à rien (sauf lors d'un remplacement).
La question est donc : quel est ce principe de "rendre muette une contrainte pour satisfaire une regexp" ? Est-ce justifie dans ce contexte (ou ce que j'en ai compris) ?
Je pense qu'il veut dire que la regexp matche la sous-chaîne vide située au début de chaque ligne. Par conséquent, toutes les lignes sont sélectionnées. Il s'agit généralement d'un bug dans la regexp (sauf en cas de remplacement, e.g. s/^[^abc]*/x/ puisqu'en général, * est glouton, ou bien en cas de colorisation, par exemple avec "grep --color"). -- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / SPACES project at LORIA
Merci pour vos reponses ! Je vais pouvoir demander ce qu'il voulait dire, car je pense que son exemple n'est pas flagrant. On peut toujours compliquer les choses par plaisir, mais la son expression matche tout, donc pourquoi ne pas utiliser .* directement ? Je ne sais pas ce qu'il veut ... En attendant d'en savoir plus, je reste sur le "bug" de regexp (c'est a dire un probleme d'interface fauteuil/clavier ;-) ) Jeremy On 10/25/05, Vincent Lefevre <vincent@vinc17.org> wrote:
On 2005-10-24 18:05:43 +0200, Jeremy Monnet wrote:
En bref, dans le poly de cours, il est marque : " Soit la regexp ^[^abc]*
Soit un fichier contenant : ascenseur chameau berceau elephant
la regexp selectionne toutes les lignes, a cause du principe de rendre muette une contrainte pour satisfaire la regexp globalement "
J'ai cherche un peu pour trouver que finalement une regexp faisant ce qu'on lui demande (enfin ce que je crois etre le but de cette regexp : ne trouver que elephant) serait ^[^abc][a-z]* Mon impression est donc plutot que l'utilisation de l'etoile est mauvaise (mal placee)
En fait, il y a généralement deux contextes possibles, suivant les applications: 1) soit une regexp doit matcher toute une ligne (ou toute une chaîne), 2) soit elle peut matcher une partie de la ligne (ou chaîne) seulement. En général, on est dans le cas 2, et on utilise ^ et/ou $ pour matcher le début et/ou fin de la ligne. Mais alors, teminer sa regexp par une sous-expression étoilée ne sert à rien (sauf lors d'un remplacement).
La question est donc : quel est ce principe de "rendre muette une contrainte pour satisfaire une regexp" ? Est-ce justifie dans ce contexte (ou ce que j'en ai compris) ?
Je pense qu'il veut dire que la regexp matche la sous-chaîne vide située au début de chaque ligne. Par conséquent, toutes les lignes sont sélectionnées. Il s'agit généralement d'un bug dans la regexp (sauf en cas de remplacement, e.g. s/^[^abc]*/x/ puisqu'en général, * est glouton, ou bien en cas de colorisation, par exemple avec "grep --color").
-- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / SPACES project at LORIA _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
J'ai l'explication : il insistait juste sur le fait que * peut valoir 0. Il dit à ce moment-là que la contrainte devient muette ... no comment. Jeremy On 10/25/05, Jeremy Monnet <jmonnet@gmail.com> wrote:
Merci pour vos reponses ! Je vais pouvoir demander ce qu'il voulait dire, car je pense que son exemple n'est pas flagrant. On peut toujours compliquer les choses par plaisir, mais la son expression matche tout, donc pourquoi ne pas utiliser .* directement ? Je ne sais pas ce qu'il veut ... En attendant d'en savoir plus, je reste sur le "bug" de regexp (c'est a dire un probleme d'interface fauteuil/clavier ;-) )
Jeremy
On 10/25/05, Vincent Lefevre <vincent@vinc17.org> wrote:
On 2005-10-24 18:05:43 +0200, Jeremy Monnet wrote:
En bref, dans le poly de cours, il est marque : " Soit la regexp ^[^abc]*
Soit un fichier contenant : ascenseur chameau berceau elephant
la regexp selectionne toutes les lignes, a cause du principe de rendre muette une contrainte pour satisfaire la regexp globalement "
J'ai cherche un peu pour trouver que finalement une regexp faisant ce qu'on lui demande (enfin ce que je crois etre le but de cette regexp : ne trouver que elephant) serait ^[^abc][a-z]* Mon impression est donc plutot que l'utilisation de l'etoile est mauvaise (mal placee)
En fait, il y a généralement deux contextes possibles, suivant les applications: 1) soit une regexp doit matcher toute une ligne (ou toute une chaîne), 2) soit elle peut matcher une partie de la ligne (ou chaîne) seulement. En général, on est dans le cas 2, et on utilise ^ et/ou $ pour matcher le début et/ou fin de la ligne. Mais alors, teminer sa regexp par une sous-expression étoilée ne sert à rien (sauf lors d'un remplacement).
La question est donc : quel est ce principe de "rendre muette une contrainte pour satisfaire une regexp" ? Est-ce justifie dans ce contexte (ou ce que j'en ai compris) ?
Je pense qu'il veut dire que la regexp matche la sous-chaîne vide située au début de chaque ligne. Par conséquent, toutes les lignes sont sélectionnées. Il s'agit généralement d'un bug dans la regexp (sauf en cas de remplacement, e.g. s/^[^abc]*/x/ puisqu'en général, * est glouton, ou bien en cas de colorisation, par exemple avec "grep --color").
-- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / SPACES project at LORIA _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
Le mer 26 octobre, Jeremy Monnet a écrit :
J'ai l'explication : il insistait juste sur le fait que * peut valoir 0. Il dit à ce moment-là que la contrainte devient muette ... no comment.
Ben si justement, comment !! Puisqu'il a reussi ce qu'il voulait faire a mon avis, ie te faire reflechir sur l'utilisation du * ! Et il a fort bien reussi (pour toi au moins, les autres j'en doute un peu plus :) Et donc tu as bien compris qu'il faut éviter au maximum l'utilisation du * dans une regex !! </pedagogue>
:-) Oui, je pense juste qu'il ne faut pas inventer un théorème pour expliquer un fonctionnement normal. Par contre, poser la question en TP s'imposerait (enfin ce n'est que mon avis, et de toute facon les étudiants ne sont jamais contents !) Jeremy On 10/26/05, Bruno Bonfils <asyd@debian-fr.org> wrote:
Le mer 26 octobre, Jeremy Monnet a écrit :
J'ai l'explication : il insistait juste sur le fait que * peut valoir 0. Il dit à ce moment-là que la contrainte devient muette ... no comment.
Ben si justement, comment !! Puisqu'il a reussi ce qu'il voulait faire a mon avis, ie te faire reflechir sur l'utilisation du * ! Et il a fort bien reussi (pour toi au moins, les autres j'en doute un peu plus :)
Et donc tu as bien compris qu'il faut éviter au maximum l'utilisation du * dans une regex !! </pedagogue> _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
On 2005-10-26 12:59:31 +0200, Bruno Bonfils wrote:
Et donc tu as bien compris qu'il faut éviter au maximum l'utilisation du * dans une regex !! </pedagogue>
À la fin d'une regexp, oui: c'est généralement un bug ou inutile. Mais à l'intérieur, ça se trouve très souvent. Le tout est de savoir ce qu'on fait. Par exemple, pour grepper un nombre en décimal, il faut utiliser [0-9]+ et non [0-9]*. En fait, l'étoile s'utilise généralement avec le point, pour passer sur une sous-chaîne quelconque. Par exemple, dans une de mes règles procmail, j'utilise: ^Content-Type:.*charset="?(EUC|GB2312|ISO-2022-JP|windows-1251) -- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / SPACES project at LORIA
Je connais pas ce fameux principe, mais bon. "*" signifie "0 ou plus", "?" signifie "0 ou 1", et "+" signifie "1 ou plus". "[^abc]*" veut dire: "tout sauf a, b ou c, 0 fois ou plus". Autrement dit ça matche n'importe quel caractère. Si donc tu veux éviter ce qui commence par a, b ou c, il faut écrire: "^[^abc].*" Enfin, à priori, et si c'est bien ce que tu demandes. PJ Jeremy Monnet a écrit :
Bonjour,
J'ai un cours d'administration d'unix en ce moment, et j'ai une question concernant les expressions regulieres (que je pourrais poser au formateur, mais je ne suis pas sur d'obtenir une reponse satisfaisante, en plus de ne pas avoir d'avis contradictoire).
En bref, dans le poly de cours, il est marque : " Soit la regexp ^[^abc]*
Soit un fichier contenant : ascenseur chameau berceau elephant
la regexp selectionne toutes les lignes, a cause du principe de rendre muette une contrainte pour satisfaire la regexp globalement "
J'ai cherche un peu pour trouver que finalement une regexp faisant ce qu'on lui demande (enfin ce que je crois etre le but de cette regexp : ne trouver que elephant) serait ^[^abc][a-z]* Mon impression est donc plutot que l'utilisation de l'etoile est mauvaise (mal placee)
La question est donc : quel est ce principe de "rendre muette une contrainte pour satisfaire une regexp" ? Est-ce justifie dans ce contexte (ou ce que j'en ai compris) ?
Merci pour votre aide !
Jeremy _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
-- Sparx Inc. 34 rue du Sentier 75002 Paris Tel. +33 (0) 1 44 34 29 21 Std +33 (0) 1 44 34 29 29 Fax +33 (0) 1 55 73 17 07 http://www.sparx.com
participants (4)
-
Bruno Bonfils
-
Jeremy Monnet
-
Philippe Jacquot
-
Vincent Lefevre