Nasıl bir regex sadece yakalanan öğeleri değiştirebilirsiniz?

3 Cevap php

Ben normal ifadeler kullanarak bir dize yalnızca bazı unsurları ayıklamak çalışıyorum ve ben sadece yakalanan grupları ile bitirmek istiyorum.

Örneğin, "This is a test" gibi bir dize (is|a) gibi bir şey çalıştırmak ister ve sadece "is is a" dönmek mümkün olurdu. Ben bütün başlangıç ​​ve dizenin sonunu bulmak ama bunu yakalamak yoksa ben kısmen şimdi bunu yapabilirsiniz tek yoludur:

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

Ben bunu, ancak, nihai bulunan / yakalanan grup önceki yalnızca karakterleri elimine edilir - son bulunan grubundan sonra her şey kalır.

is is a test.

Nasıl izole ve sadece yakalanan dizeleri değiştirebilirsiniz (ben sonuna kadar böylece "is is a"), PHP ve Perl hem de?

Teşekkürler!

Edit: I see now that it's better to use m// rather than s///, but how can I apply that to PHP's preg_match? In my real regex I have several captured group, resulting in $1, $2, $3 etc -- preg_match only deals with one captured group, right?

3 Cevap

İstediğiniz tüm maçlar ise, s/// operatör gerek yoktur. Sen kullanmanız gerekir m//. Aşağıdaki örnek, sizin ihtiyaçlarınızı karşılamak değil eğer açıklama biraz genişletmek isteyebilirsiniz:

#!/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: PHP için, preg_match_all kullanın ve belgelerinde gösterildiği gibi maç sonuçları tutmak için bir dizi belirtmelidir.

Sen sadece yakalar yerini alamaz. s/// her maçta dahil her şeyi değiştirir. Sen, ek öğeler yakalamak ve yerine bunları içeren veya aren't maçta dahil olduğu şeyleri gerektirecek iddialar kullanmanız gerek duyarsınız.

O dedi, ben gerçekten ne soruyorsun sanmıyorum. Mı Sinan's answer sonra ne konum?

Sen yakalar içine her şeyi koymak ve sonra yalnızca istediğiniz olanları değiştirir.

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