2011-09-28 14 views
31

के माध्यम से पुनरावृति मान लीजिए कि मैं कच्चे एचटीएमएल इस regex के लिए देख के एक पेज के माध्यम से स्कैनिंग कर रहा हूँ करते हैं। (अंत पर उद्धरण चिह्न जानबूझकर है)।पर्ल प्रत्येक मैच

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

यह पैटर्न ~ 100 बार मिलान होने की संभावना है। एक आम पर्ल मुहावरा/एक त्वरित तरीका है सब पर कब्जा समूह मैचों की एक सूची के माध्यम से पुनरावृति करने के लिए क्या है?

उत्तर

49
perlretut (एक बहुत ठीक ट्यूटोरियल) से

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

आप while एक साथ उपयोग कर सकते हैं g संशोधक से सभी मैचों में पुनरावृत्ति के लिए, $1 साथ आप अपने कैप्चरिंग समूह 1 की सामग्री को मिलता है, और इस में ट्यूटोरियल से उदाहरण आप भी pos साथ स्थिति मिलता है।

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

धन्यवाद perlretut recommanding के लिए Stema: यह पर्ल में रेगुलर एक्सप्रेशन के लिए एक भयानक पृष्ठ है; यह शुरुआत से उन्नत करने के लिए सब कुछ शामिल है। –

+0

'm' संशोधक जोड़ने के लिए मत भूलना यदि आप बहु लाइन तार और एंकर ^, $ के साथ सौदा –

6

वैश्विक मिलान 'g' संशोधक सूची संदर्भ में कब्जा मैचों की एक सूची देता है मुझे लगता है कि अपने दृष्टिकोण अधिक कॉम्पैक्ट है। आशा है कि निम्नलिखित स्निपेट अपने उदाहरण समझने में मदद मिलेगी

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

आउटपुट:

date, name, lang 
संबंधित मुद्दे