regexp différence entre (?:mot) et (mot)?

regexp différence entre (?:mot) et (mot)? - HTML/CSS - Programmation

Marsh Posté le 03-10-2006 à 13:28:35    

Je suis en train de faire des tests de JS sur les regexp en ce moment. Et là je bloque sur un truc, quel est la différence entre (?:mot) et (mot)?
En prenant ce code :  

Code :
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4.  var w=function(str) {document.write(str)};
  5.  str = "trucbidule";
  6.  str2 = "trucmachin";
  7.  re=/truc(bidule)?/;
  8.  re2=/truc(?:bidule)/;
  9.  w("<h1>Regexp 'trucbidule'</h1>" );
  10.  w("match(/truc(bidule)?/) : "+str.match(re)+"<br>" );
  11.  w("match(/truc(?:bidule)/) : "+str.match(re2)+"<br>" );
  12.  w("/truc(bidule)?/.test(str) : "+re.test(str)+"<br>" );
  13.  w("/truc(?:bidule)/.test(str) : "+re.test(str)+"<br>" );
  14.  w("<h1>Regexp 'trucmachin'</h1>" );
  15.  w("match(/truc(bidule)?/) : "+str2.match(re)+"<br>" );
  16.  w("match(/truc(?:bidule)/) : "+str2.match(re2)+"<br>" );
  17.  w("/truc(bidule)?/.test(str) : "+re.test(str2)+"<br>" );
  18.  w("/truc(?:bidule)/.test(str) : "+re2.test(str2)+"<br>" );
  19. </script>
  20. </head>
  21. <body>
  22. </body>
  23. </html>


 
J'obtiens ceci comme résultat

Citation :


Regexp 'trucbidule'
match(/truc(bidule)?/) : trucbidule,bidule
match(/truc(?:bidule)/) : trucbidule
/truc(bidule)?/.test(str) : true
/truc(?:bidule)/.test(str) : true
Regexp 'trucmachin'
match(/truc(bidule)?/) : truc,
match(/truc(?:bidule)/) : null
/truc(bidule)?/.test(str) : true
/truc(?:bidule)/.test(str) : false


 
Mais là je ne vois toujours pas la différence entre (?:mot) et (mot)?
 
Je sais que dans la regexp suivant (que j'ai faite moi même)
truc(bidule)?
on matchera les mots :  
truc, trucbidule, trucnimportequoi
 
D'après la spec (?:mot) c'est pour spécifier une écriture littérale pour respecter un mode objet mais bon en anglais c'est un peu lourd à lire :/
http://www.ecma-international.org/ [...] ma-262.pdf (page 34)
 
Si quelqu'un pouvais m'éclairer sur l'utilité d'une telle écriture et/ou me tourner vers des tutos anglais/francais pour bien comprendre l'animal.
Merci par avance


Message édité par gatsu35 le 03-10-2006 à 13:30:59
Reply

Marsh Posté le 03-10-2006 à 13:28:35   

Reply

Marsh Posté le 03-10-2006 à 13:33:15    

j'aime bien la doc perl sur les regex: http://www.perl.com/doc/manual/html/pod/perlre.html
Tu y trouveras l'explication suivante:

Citation :

(?:pattern)
(?imsx-imsx:pattern)

 
    This is for clustering, not capturing; it groups subexpressions like ``()'', but doesn't make backreferences as ``()'' does.
...


 
edit: remarque en js c'est du posix les regex ... enfin je crois :o


Message édité par anapajari le 03-10-2006 à 13:37:12
Reply

Marsh Posté le 03-10-2006 à 13:39:29    

Heu là tu m'embrouilles encore plus [:petrus75]


Message édité par gatsu35 le 03-10-2006 à 13:39:36
Reply

Marsh Posté le 03-10-2006 à 13:48:24    

ok petit exemple simple
sur la chaine suivante "pouet pouet la pirouette" on applique les deux regex:

/(p(ouet))/g


et

/(p(?:ouet))/g


 
Avec la première tu as "pouet" dans $1 et "ouet" dans $2 ( deux fois à cause du g)
Avec la deuxieme tu as juste "pouet", le motif décrit dans la parenthèse contenant ?: n'est pas référencé, néanmoins ça te permet de les grouper.
 
Est-ce plus clair?


Message édité par anapajari le 03-10-2006 à 13:49:01
Reply

Marsh Posté le 03-10-2006 à 14:00:03    

\[:dawa]/ Je t'aime  
Jvais faire des tests cet aprem ou ce soir et jte redis ça :o

Reply

Marsh Posté le 03-10-2006 à 14:27:12    

sinon j'ai trouvé un tester de regexp sympatique
 
http://www.codeproject.com/useritems/RegEx_Tracer.asp
et gratuit/open source  
il doit être en .NET :D
 
il permet de tester une regexp rapidement, mais si on veut coloriser les groupes de mots dans la regexp c'est tout con, il suffit de faire des groupements avec les braces ()

Reply

Sujets relatifs:

Leave a Replay

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