2009-06-22 8 views
1

J'essaye d'extraire seulement certains éléments d'une chaîne en utilisant des expressions régulières et je veux finir avec seulement les groupes capturés.Comment puis-je remplacer uniquement les éléments capturés d'une regex?

Par exemple, je voudrais exécuter quelque chose comme (is|a) sur une chaîne comme "This is a test" et être en mesure de retourner seulement "is is a". La seule façon que je peux faire partie, il est maintenant si je trouve tout le début et la fin de la chaîne, mais ne capture pas:

.*?(is|a).*? replaced with $1 

Cependant, quand je fais cela, seuls les caractères précédant la finale trouvé/le groupe capturé est éliminé - tout reste après le dernier groupe trouvé.

is is a test. 

Comment puis-je isoler et de ne remplacer que les chaînes capturées (de sorte que je me retrouve avec "is is a"), à la fois PHP et Perl?

Merci!

Edit: Je vois maintenant qu'il est préférable d'utiliser m// plutôt que s///, mais comment puis-je l'appliquer à PHP de preg_match? Dans mon vrai regex j'ai plusieurs groupes capturés, résultant en $1, $2, $3 etc - preg_match traite seulement un groupe capturé, non?

Répondre

5

Si tout ce que vous voulez sont les matches, l'on n'a pas besoin de l'opérateur s///. Vous devez utiliser m//. Vous pouvez développer votre explication un peu si l'exemple ci-dessous ne répond pas à vos besoins:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $text = 'This is a test'; 

my @matches = ($text =~ /(is|a)/g); 

print "@matches\n"; 
__END__ 

C:\Temp> t.pl 
is is a 

EDIT: Pour PHP, vous devez utiliser preg_match_all et spécifier un tableau pour contenir les résultats match comme indiqué dans La documentation.

+0

Cela a fonctionné! preg_match_all était la clé. Merci! – Andrew

0

Vous mettez tout dans des captures et remplace seulement celles que vous voulez.

(.*?)(is|a)(.*?) 
+0

Cela me fait toujours "est un test" ... – Andrew

1

Vous ne pouvez pas remplacer uniquement les captures. s/// remplace toujours tout ce qui est inclus dans le match. Vous devez soit capturer les éléments supplémentaires et les inclure dans le remplacement ou utiliser des assertions pour exiger des choses que ne sont pas inclus dans le match. Cela dit, je ne pense pas que ce soit ce que vous demandez vraiment. Est-ce Sinan's answer ce que vous cherchez?

Questions connexes