2011-09-28 24 views
31

Bu regex'i arayan bir ham html sayfası taradığımı varsayalım. (Sondaki teklif işareti kasıtlıdır).Perl her bir eşleşme boyunca yinelenir

m/(https?:\/\/.*?(?:'|"))/ 

Bu desen muhtemelen yaklaşık 100 kez eşleşecektir. Yaygın bir perl deyimi/tüm yakalama grubu eşleşmelerinin listesi boyunca yinelemenin hızlı bir yolu nedir?

cevap

49
Eğer yakalama grubu 1'in içeriği almak $1 ile tüm maçları tekrarlatacak g değiştirici ile birlikte while kullanabilirsiniz

while ($x =~ /(\w+)/g) { 
     print "Word is $1, ends at position ", pos $x, "\n"; 
    } 

perlretut (çok ince öğretici) itibaren

, ve bunda Örnek olarak, aynı zamanda pos ile pozisyonunu alırsınız.

say $_ for $str =~ /un($wanted)/g; # Prints only $wanted 
+1

teşekkürler perlretut recommanding için STEMA: Perl ile yazılan Normal İfadeler için müthiş bir sayfası; Başlangıçtan ileri seviyeye kadar her şeyi kapsar. –

+0

Çok satırlı dizelerle ve çapalarla uğraşırsanız 'm' değiştiricisini eklemeyi unutmayın ^, $ –

6

küresel eşleştirme 'g' değiştirici liste kapsamında yakalanan eşleşmelerin listesini döndürür ben yaklaşımınız daha kompakt olduğunu düşünüyorum. Aşağıdaki pasajı ömeği anlamaya yardımcı olacağını umuyoruz

my $str = 'file_%date%_%name%_%lang%.txt'; 
my @ts = $str =~ /%([\w]+)%/g;#   <----------Zahid said 
print join(", ", @ts); 

Çıktı:

date, name, lang 
İlgili konular