2011-03-28 13 views
11

मिलान regexp मैं दो सीमांकक, यानी के बीच स्ट्रिंग दूर करने के लिए प्रदर्शित होने वाली "123XabcX321" मैं चाहता हूँ "123,321" है। एक सरल मामले के लिए, मैं के साथ ठीक हूँ:"उत्सुक"

$_=<>; 
s/X(.*)X//; 
print; 

लेकिन वहाँ "123XabcXasdfjXasdX321" की तरह इनपुट में अस्पष्टता नहीं है, तो यह पिछले एक्स के साथ पहली बार एक्स से मेल खाता है और मैं "123,321" मिल लेकिन मैं चाहता हूँ " 123asdfj321 "। क्या कोई "उत्सुक" मैच निर्दिष्ट करने का कोई तरीका है जो पहले मान्य संभावित डेलीमीटर से मेल खाता है और आखिरी नहीं?

उत्तर

28

यह सामान्य रूप से कहा जाता है "ungreedy", आप एक डाल? परिमाणक के बाद: s/X(.*?)X//;

+1

और दिए गए उदाहरण में,/जी को एक से अधिक बार प्रतिस्थापित करने की आवश्यकता होगी। – ysth

+0

मुझे लगता है कि "गैर लालची" अधिक आम शब्द है। किसी भी दर पर, डिफ़ॉल्ट लालची मिलान है, और आप विपरीत चाहते हैं। – cjm

+0

धन्यवाद, कि मैं – GClaramunt

6

कुछ भी लेकिन एक प्रदर्शन संकेत करता है, तो आप कर सकते हैं के रूप में गैर लालची संशोधक से बचें। इसका उपयोग करने से "अप्रत्याशित" परिणाम हो सकते हैं क्योंकि ? जोड़ना वास्तव में किसी भी मिलान से .* को रोकता नहीं है। उदाहरण के लिए,

$ perl -le'print for "XaXbXY" =~ /X(.*?)XY/;' 
aXb 

X मिलान बचने के लिए आप उपयोग कर सकते हैं निम्नलिखित:

:

s/X[^X]*X//g; 

तो X वास्तव में बड़ा कुछ है एक चरित्र की तुलना में, आप निम्न का उपयोग कर सकते

s/X(?:(?!X).)*X//g; 
+0

दिलचस्प ... मैं कोशिश करूँगा। मेरे मामले में, एक्स एक से अधिक चार है। मुझे समझना होगा ?:(?! एक्स) tho – GClaramunt

+0

@GClaramunt, '(?:) 'रेगेक्स पैटर्न में' पर्ल में '()' की तरह हैं। इस मामले में, यह इंगित करता है कि '*' '' 'के बजाय' (?! X) .' को प्रभावित करता है। '()' इस उद्देश्य के लिए अक्सर दुरुपयोग किया जाता है। – ikegami

+0

@GClaramunt, '(?!) 'जांचता है कि जो भी है वह निहित पैटर्न से मेल नहीं खाता है। – ikegami

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