2011-06-16 9 views
10

नोब प्रश्न के साथ एक नियमित अभिव्यक्ति को कई बार मिलान करना। मैं एक बहुत ही सरल पर्ल स्क्रिप्ट है और मैं regex स्ट्रिंगपर्ल

my $string = "ohai there. ohai"; 
my @results = $string =~ /(\w\w\w\w)/; 
foreach my $x (@results){ 
    print "$x\n"; 
} 

में कई भागों मिलान करने के लिए इस तरह से मैं चाहता हूँ के रूप में यह केवल रिटर्न ohai काम नहीं कर रहा चाहते हैं। मैं इसे ओहाई थू ओई

मैं इसे करने के बारे में कैसे जाना चाहूंगा।

धन्यवाद

उत्तर

28

क्या आप यह चाहते हैं?

my $string = "ohai there. ohai"; 
while ($string =~ m/(\w\w\w\w)/g) { 
    print "$1\n"; 
} 

यह रिटर्न

ohai 
ther 
ohai 

perlretut से:

आपरिवर्तक "// जी" वैश्विक मिलान के लिए खड़ा है और मिलान ऑपरेटर एक स्ट्रिंग के रूप में कई के भीतर मिलान करने के लिए अनुमति देता है जितना संभव हो सके समय।

इसके अलावा, अगर आप एक सरणी में मैच रखना चाहते हैं के बजाय आप कर सकते हैं:

my $string = "ohai there. ohai"; 
my @matches = ($string =~ m/(\w\w\w\w)/g); 
foreach my $x (@matches) { 
    print "$x\n"; 
}  
+2

+1। सही उत्तर। आपको अपने रेगेक्स के अंत में 'जी' संशोधक की आवश्यकता है। – Spudley

+2

धन्यवाद! मुझे लगता है कि मुझे उस/g –

+0

के लिए दस्तावेज़ों पर अधिक बारीकी से देखने की आवश्यकता है, यह ध्यान रखना उपयोगी है कि "foreach" में, "प्रिंट $ 1" केवल एक पैटर्न मिलान (यानी प्रत्येक बार के लिए अंतिम "ओईई" प्रिंट करेगा 3 बार)। इसलिए, "जबकि" कई तत्वों के साथ पैटर्न होने पर सबसे अच्छा विकल्प प्रतीत होता है। –

0

या आप इस

my $string = "ohai there. ohai"; 
my @matches = split(/\s/, $string); 
foreach my $x (@matches) { 
    print "$x\n"; 
} 

इस मामले में विभाजन समारोह पर विभाजन कर सकता है रिक्त स्थान और प्रिंट

ohai 
there. 
ohai 
+0

अच्छा सुझाव लेकिन यहां विभाजित "वहां" वापस आ जाएगा। एक बिंदु के साथ। केवल शब्दों को प्राप्त करने के लिए "विभाजन (/ \ W + /, $ string)" करना बेहतर होगा। –