RegEx: सबसे छोटा संभव मैच या nongreedy मैच


जवाबों:


192

जैसे एक नियमित अभिव्यक्ति के लिए .*या की.+ , एक प्रश्न चिह्न ( .*?या .+?) को संभव के रूप में कुछ वर्णों से मेल करने के लिए जोड़ें । वैकल्पिक रूप से एक अनुभाग से (?:blah)?मेल खाने के लिए लेकिन मिलान के बिना जब तक कि बिल्कुल आवश्यक न हो, जैसे कुछ का उपयोग करें (?:blah){0,1}?। एक दोहरा मैच के लिए (या तो का उपयोग कर {n,}या {n,m}एक प्रश्न चिह्न सिंटेक्स) संलग्न संभव (जैसे जितने कम मैच के लिए प्रयास करने के लिए {3,}?या {5,7}?)।

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


7
मुझे नहीं पता, अगर मैं इस गलतफहमी के साथ एक ही हूं, लेकिन यह नोट करना महत्वपूर्ण है: जबकि यह सच है कि गैर-लालची ऑपरेटर संभव के रूप में कुछ वर्णों से मेल खाएगा, यह अभी भी एक मैच नहीं दिख रहा है हो सकता है के लिये। RegEx के मानकों के बारे में "कम से कम वर्ण" के बराबर "सबसे कम संभव मैच" नहीं है। मेरी टिप्पणी के नीचे जवाब देखें: के साथ abcabkऔर a.+?k, RegEx पूरे स्ट्रिंग से मेल खाएगा।
फाइनफुट

Line2 "लेकिन मिलान के बिना जब तक बिल्कुल आवश्यक न हो": इसका क्या मतलब है?
बारिश हो रही


45

गैर लालची ऑपरेटर का मतलब कम से कम संभावित मैच से नहीं है:

abcabk

a.+?k केवल अंतिम तीन संकेतों के बजाय पूरे स्ट्रिंग (इस उदाहरण में) से मेल खाएगा।

मैं वास्तव में इसके बजाय सबसे छोटा संभव मैच ढूंढना चाहता हूं।

वह ' a' के लिए अंतिम संभावित मैच अभी भी सभी मैचों के लिए अनुमति देता है k

मुझे लगता है कि ऐसा करने का एकमात्र तरीका यह है कि अभिव्यक्ति का उपयोग कैसे किया जाए:

a[^a]+?k


2
या रिवर्स ऑर्डर में खोज करें, अंत में शुरू, जब मैचों को नेस्टेड किया जाता है: "(ab (abk) bk)"।
LBogaardt

7
@Logaardt रिवर्स ऑर्डर में कोई कैसे खोज करेगा? नहीं मिलता है
azerafati

2
@Logaardt अभी भी खुला प्रश्न: रिवर्स ऑर्डर में कोई कैसे खोज करेगा? मुझे लगता है मैं प्राप्त करना चाहते हैं कहते हैं cab। यदि मेरा इनपुट है caaacabऔर मैं a.*?bइसके लिए खोज करता हूं , तो लघु मिलान के बजाय पूर्ण स्ट्रिंग वापस कर देगा। मैं पीछे से कैसे खोजूंगा b?
C4d

3
स्ट्रिंग को उल्टा करें, फिर रेगेक्स लागू करें।
जोनाथन एलन

3
यह सुपर सहायक है। मेरे जैसे लोगों के लिए यह समझने की कोशिश करना कि यहाँ क्या सामान्य रूप चल रहा है START[^START]*?END(जहाँ START और END आपकी शुरुआत और अंत वर्ण प्रतिक्षेप हैं)। इसका अनिवार्य रूप से अर्थ है "START से END तक कुछ भी मिलान करें जहां बीच-बीच में अक्षर START को फिर से शामिल नहीं करते हैं"
derekantrican
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.