पहले मैच में रोकने के लिए नियमित अभिव्यक्ति


528

मेरा रेगेक्स पैटर्न कुछ ऐसा दिखता है

<xxxx location="file path/level1/level2" xxxx some="xxx">

मुझे केवल स्थान पर निर्दिष्ट उद्धरणों में भाग में दिलचस्पी है। यह लालची स्विच के बिना नीचे के रूप में आसान नहीं होना चाहिए?

/.*location="(.*)".*/

काम नहीं लगता है।


आपका स्रोत क्या है, यह HTML या xml या कुछ और है?
Oskar Kjellin

20
यह एक समुदाय विकि क्यों है? यह एक वास्तविक प्रश्न है। अब बहुत अधिक देर हो चुकी है।
अहमद मैजेद

1
आप किस भाषा में लिख रहे हैं? कृपया XML के लिए regex का उपयोग न करें। XML को पार्स करने के लिए कई बेहतर तरीके हैं
ऑस्कर केजेलिन

3
नहीं अगर आप चाहते हैं कि सभी को सरल विशेषताओं के लिए स्कैन करना है। रेगेक्स उचित और तेज है।
कोडेनहेम

मैं कहूंगा कि यदि आप उदाहरण के लिए कोड c # तो इसके लिए linq का उपयोग करना बेहतर है। मुझे संदेह है कि यदि आपके पास एक अच्छा पार्सर है तो
रेक्सक्स

जवाबों:


1092

आपको अपनी नियमित अभिव्यक्ति को गैर-लालची बनाने की आवश्यकता है, क्योंकि डिफ़ॉल्ट रूप से, "(.*)"सभी से मेल खाएगा "file path/level1/level2" xxx some="xxx"

इसके बजाय आप अपने डॉट-स्टार को गैर-लालची बना सकते हैं, जिससे यह संभव के रूप में कुछ वर्णों से मेल खाएगा:

/location="(.*?)"/

?एक क्वांटिफायर ( या ?, ) पर जोड़ने से यह गैर-लालची हो जाता है।*+


32
एफडब्ल्यूआईडब्ल्यू, वीआईएम का उपयोग करके अपने को मिटा दें, इस रेगेक्स को थोड़ा अलग होने की जरूरत है: इसके बजाय .*?यह .\{-}एक गैर-लालची मैच के लिए है।
SooDesuNe

44
धन्यवाद डैनियल। "एक मात्रा जोड़ने पर (?, *, या +) इसे गैर-लालची बनाता है।" मेरे लिए सहायक टिप है।
फतहवी

10
? यह पता लगाने की कोशिश में मेरी उलझन का वर्णन करता है। कितना उचित है।
रॉबी स्मिथ

1
मेरा मानना ​​है कि आप 'गैर-लालची' के बजाय 'आलसी' कह सकते हैं
मैटिकोर

50

location="(.*)"location=जब some="xxxतक आप " गैर-लालची " बनाते हैं, तब से "बाद में" से मेल खाएगा । इसलिए आपको या तो इसकी आवश्यकता है .*?(यानी इसे गैर-लालची बनाएं) या बेहतर तरीके से प्रतिस्थापित .*करें [^"]*


3
[^ "] * अधिकांश रेगेक्स इंजनों के साथ भी संभवत: तेज है क्योंकि इसे मौजूदा पैटर्न के बाद पैटर्न देखने की आवश्यकता नहीं है।
जीन विंसेंट

1
@ किप: आप शायद सही हैं, लेकिन .*?[^"]*
संकेताक्षर

कैसे के बारे में अगर मैं [^] * * का उपयोग करके सीमांकक चरित्र को शामिल करना चाहता हूं
Frohlich

बिल्कुल नहीं, अगर आप नहीं जानते कि क्या ^ और [] का मतलब यहाँ है। अधिकांश लोग समझेंगे। *
विंसेंट गेरिस

31

कैसा रहेगा

.*location="([^"]*)".*

यह असीमित खोज से बचता है। * और पहले भाव से बिल्कुल मेल खाएगा।


यदि पोर्टेबिलिटी एक चिंता का विषय है, तो जीआरईपी में विसंगतियों के कारण उपरोक्त पसंदीदा पैटर्न होना चाहिए।
जोश हबदास

22

यदि आपका इंजन इसका समर्थन करता है, तो गैर-लालची मिलान का उपयोग करें। जोड़ें ? कैद के अंदर।

/location="(.*?)"/

11

?बिना किसी वैश्विक झंडे के लेजी क्वांटिफायर का उपयोग इसका जवाब है।

उदाहरण के लिए,

यहाँ छवि विवरण दर्ज करें

यदि आपके पास वैश्विक ध्वज था /g, तो यह नीचे के रूप में सभी निम्नतम लंबाई के मिलान से मेल खाता होगा। यहाँ छवि विवरण दर्ज करें


1

क्योंकि आप परिमाणित उपपरिवार का उपयोग कर रहे हैं और पर्ल डॉक में वर्णित है ,

डिफ़ॉल्ट रूप से, एक परिमाणित उप-समूह " लालची " है, अर्थात, यह बाकी के पैटर्न से मेल खाने की अनुमति देते हुए यथासंभव कई बार (किसी विशेष स्थान को देखते हुए) मेल करेगा। आप यह चाहते हैं बार की न्यूनतम संख्या से मेल करने के लिए संभव, परिमाणक पालन के साथ एक "?" । ध्यान दें कि अर्थ नहीं बदलते हैं, बस "लालच":

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

इस प्रकार, अपने निर्धारित पैटर्न को न्यूनतम मिलान बनाने के लिए, इसके द्वारा इसका पालन करें ?:

/location="(.*?)"/

1

यहाँ एक और तरीका है।

यहाँ आप चाहते हैं। यह आलसी है[\s\S]*?

पहला आइटम: इसके [\s\S]*?(?:location="[^"]*")[\s\S]* साथ बदलें:$1

स्पष्टीकरण : https://regex101.com/r/ZcqcUm/2


पूर्णता के लिए, यह अंतिम मिलता है। यह लालची है[\s\S]*

अंतिम आइटम: इसके[\s\S]*(?:location="([^"]*)")[\s\S]* साथ बदलें:$1

व्याख्या : https://regex101.com/r/LXSPDp/3


इन दो नियमित अभिव्यक्तियों में केवल 1 अंतर है और वह है ?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.