2012-06-26 16 views
5
my @matches = ($result =~ m/INFO\n(.*?)\n/); 

तो पर्ल में मैं सभी मैचों को उस नियमित अभिव्यक्ति में स्टोर करना चाहता हूं। मैं प्रत्येक बार होने पर INFO \ n और \ n के बीच मान को संग्रहीत करना चाहता हूं।रेगेक्स - सभी घटनाओं से मेल खाते हैं?

लेकिन मुझे केवल अंतिम घटना संग्रहित हो रही है। क्या मेरा रेगेक्स गलत है?

+0

संभावित डुप्लिकेट [मैं पर्ल में नियमित अभिव्यक्ति के लिए सभी मैचों को कैसे ढूंढ सकता हूं?] (Http://stackoverflow.com/questions/1723440/how-can-i-find-all-matches-to-a- नियमित अभिव्यक्ति-इन-पर्ल) – centic

उत्तर

10

वैश्विक मिलान के लिए /g संशोधक का उपयोग करें।

my @matches = ($result =~ m/INFO\n(.*?)\n/g); 

सुस्त परिमाणन . के रूप में इस मामले को नई पंक्तियों से मेल नहीं खाता में अनावश्यक है। यदि आप समय के नई-पंक्तियों से मेल करना चाहते हैं

my @matches = ($result =~ m/INFO\n(.*)\n/g); 

/s इस्तेमाल किया जा सकता: निम्नलिखित बेहतर प्रदर्शन देना होगा। इन संशोधकों के बारे में अधिक जानकारी के लिए, perlre देखें।

+0

आलसी मात्रा '। *?' रेगेक्स प्रदर्शन को नुकसान पहुंचाता है –

+0

क्यों '/ s' की आवश्यकता है? मुझे इसके लिए कोई कारण नहीं दिखता है, क्योंकि उनके मैच ** में ** कोई नया-रेखा वर्ण नहीं होना चाहिए। –

+0

आप सही हैं कि इससे इस मामले में कोई फर्क नहीं पड़ता है, लेकिन चूंकि वह '/ g' के बारे में नहीं जानता था और बहु-पंक्ति तारों से मेल खाता था, इसलिए यह उचित लग रहा था कि उसे जल्द या बाद में '/ s' की आवश्यकता होगी। – Tim

संबंधित मुद्दे