2012-08-10 16 views
191

मुझे गैर लालची विकल्प के साथ नियमित अभिव्यक्ति मिलान के बारे में मदद चाहिए।मैं एक रेगेक्स कैसे लिख सकता हूं जो गैर लालची से मेल खाता है?

मैच पैटर्न है:

<img\s.*> 

पाठ से मेल करने के लिए है:

<html> 
<img src="test"> 
abc 
<img 
    src="a" src='a' a=b> 
</html> 

मैं http://regexpal.com

पर यह अभिव्यक्ति पिछले > को <img से सभी पाठ से मेल खाता का परीक्षण करें। शुरुआती <img के बाद मुझे पहले सामना किए गए > के साथ मिलान करने की आवश्यकता है, इसलिए यहां मुझे मिलने वाले दो मैचों की आवश्यकता होगी।

मैंने गैर-लालची ? के सभी संयोजनों को बिना किसी सफलता के प्रयास किए।

+5

आप किस भाषा में REGEX चला रहे हैं? – Utkanos

+0

एक्सएचटीएमएल स्वयं निहित टैग को छोड़कर [RegEx मिलान खुले टैग] का संभावित डुप्लिकेट [https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

उत्तर

278

गैर लालची ? पूरी तरह से ठीक काम करता है। यह सिर्फ इतना है कि आपको डॉट मैसेज रीगिक्स इंजन (regexpal, आपके द्वारा उपयोग किए जाने वाले इंजन में भी विकल्प है) में सभी विकल्प चुनने की आवश्यकता है, आप भी इस विकल्प के साथ परीक्षण कर रहे हैं)। ऐसा इसलिए है क्योंकि, जब आप . का उपयोग करते हैं तो रेगेक्स इंजन आमतौर पर लाइन ब्रेक से मेल नहीं खाते हैं। आप

<img\s.*?> 

ठीक काम करता है, उन्हें स्पष्ट रूप से बताने के लिए है कि आप .

उदाहरण के लिए के साथ भी लाइन ब्रेक से मिलान करना चाहते की जरूरत है!

results here देखें।

इसके अलावा, विभिन्न रेगेक्स स्वादों में how dot behaves पढ़ें।

+12

यह भी एक चाल है जो आप इसके आसपास काम करने के लिए कर सकते हैं: चूंकि इसका मतलब है "किसी भी सफेद जगह", और "\ S" का अर्थ है "कोई भी गैर-सफेद जगह", [\ s \ S] किसी भी चरित्र से मेल खाएगा (जैसे "।", लेकिन नई लाइन सहित)! इसी प्रकार, आप [\ d \ D], या [\ w \ W] का उपयोग कर सकते हैं।यह काफी आसान "हैक" हो सकता है, और यह निश्चित रूप से जागरूक होने के लिए एक बहुत ही उपयोगी चाल है। –

+3

या यहां तक ​​कि, इस उदाहरण में, आप इसका उपयोग कर सकते हैं: '] *> 'वही प्रभाव प्राप्त करने के लिए: चूंकि" '> के अलावा कोई भी वर्ण" में "नई लाइन शामिल है! –

+1

अच्छा जवाब, लेकिन कैसे bash के बारे में? echo " bla " | grep -P '' के बावजूद पूरी स्ट्रिंग से मेल खाता है? ऑपरेटर। –

47

? ऑपरेंड गैर-लालची मैच बनाता है। जैसे .* लालची है जबकि .*? नहीं है। तो आप पूरे टैग से मेल खाने के लिए <img.*?> जैसे कुछ का उपयोग कर सकते हैं। या <img[^>]*>

लेकिन याद रखें कि HTML का पूरा सेट वास्तव में नियमित अभिव्यक्तियों के साथ पार्स नहीं किया जा सकता है।

+3

पाता है आपका उत्तर इस बात से याद दिलाता है: http://stackoverflow.com/a/1732454/431 –

+2

मुझे लगता है कि यह कहना अधिक स्पष्ट है कि * '' '' का गैर लालची संस्करण है। – golopot

2

चेक स्टैक ओवरफ़्लो प्रश्न What do lazy and greedy mean in the context of regular expressions? भी देखें।

लालची का मतलब सबसे लंबी संभव स्ट्रिंग से मेल खाता है।

आलसी का मतलब सबसे छोटी संभव स्ट्रिंग से मेल खाता है।

उदाहरण के लिए, लालची एच। + एल 'हैलो' में 'नरक' से मेल खाता है, लेकिन आलसी एच। +? एल 'हेल' से मेल खाता है।

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