Accès à plusieurs captures dans un RegEx (Newbie thing …)

Dans cette capture multiple regex, je dois ajouter un drapeau "g" pour obtenir tous les éléments …

"Aaa bbb ccc \ n.000. \ N \ n.111. \ N sd555 dsf \ n.222. \ N ddd" .match (/^.(.*).$/gm)

Quand j'ajoute le drapeau "g" (global), comment accéder aux groupes capturés … il devrait y avoir 3 comme ["000", "111", "222"] mais je ne sais pas comment y accéder. .. Je continue à obtenir [".000.", ".111.", ".222."] << notez les points avant et après les mots

Si vous souhaitez obtenir des groupes de capture dans un regex global, vous ne pouvez pas utiliser la match , malheureusement. Au lieu de cela, vous devrez utiliser exec sur le regex:

 var myregex = /^.(.*).$/gm; var result, allMatches = []; while((result = myregex.exec(mystring)) != null) { var match = result[1]; // get the first match pattern of this match allMatches.push(match); } 

Avec un regex global, la match renvoie un tableau de toutes les correspondances entières et ne renvoie jamais de groupes de capture. exec renvoie une seule correspondance et tous ses groupes de capture. Pour obtenir toutes les correspondances, vous devez appeler exec plusieurs fois jusqu'à ce qu'il renvoie finalement null .

Notez que exec repose sur l'état de maintenance regex, vous devez donc sauvegarder le regex dans une variable:

 while((result = /^.(.*).$/gm.exec(mystring)) != null) // BAD and WRONG! 

C'est faux, car à chaque boucle, il y a un nouveau regex qui ne sait pas ce qui correspond, il est censé renvoyer cette boucle. (Ou, plus précisément, il ne connaît pas le dernier lastIndex de la regex précédente).

Dans FireBug:

 var hello = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ".match( /^.(.*).$/gm ); console.dir(hello); 

Ensuite, vous pouvez utiliser hello[n] où n est le match que vous voulez, tel que `hello [1].

Cependant, vous devez modifier votre regex si vous souhaitez seulement faire correspondre certaines choses.

Le résultat renvoyé de str.match (re) est un tableau.

Démo ici. http://jsfiddle.net/rXgQa/

 var re = /^.(.*).$/gm; var str = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd "; var matches = str.match( re ); if( matches ){ document.body.innerHTML += matches.join( '<br/> ' ); }​ 

Les sorties:

 aaa bbb ccc // matches[0] .000. // matches[1] .111. // matches[2] sd555 dsf // matches[3] .222. // matches[4] ddd // matches[5] 

Mettre à jour

Voici ma réponse à la deuxième partie de la question. Question: Comment se débarrasser du point avant et après les chiffres?

Ma réponse: Je ferais simplement passer les correspondances et remplacer le point par une chaîne vide. En outre, votre expression régulière est fausse car vous devez échapper au point.

Démo jsfiddle mise à jour : http://jsfiddle.net/rXgQa/1/

 var re = /^\.([^\.]+)\.$/gm; var lines = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd "; var matches = lines.match( re ); var i = (matches||[]).length; while( i-- ){ matches[i] = matches[i].replace( /\./g, '' ); } document.body.innerHTML += matches.join( '<br/>' );