रेगेक्स मैचर्स को गैर-लालची कैसे बनाया जाए?


20

मैं एक फ़ाइल में पाठ को बदलने के लिए एक regex का उपयोग करने की कोशिश कर रहा हूं (केवल प्रोटोकॉल / डोमेन / के साथ पूर्ण url बदलें):

:%s/\(https\?:\/\/.*?\/\).*/\1/gc

दुर्भाग्य से .*?स्ट्रिंग से मेल नहीं खाता है, यहां तक ​​कि ?क्वांटिफायर से बचने की कोशिश कर रहा है ? गैर-लालची क्वांटिफायर को कैसे विम में बचाना चाहिए?


2
:help greedyआपको सही मदद विषय पर ले जाता। :help regexpविम के रेगेक्स स्वाद का वर्णन करने में मदद करता है।
जैमेसन

जवाबों:


27

विम के रेगेक्स में ऑपरेटरों के गैर-लालची संस्करणों के लिए विशेष वाक्यविन्यास है (यह एक तरह से कष्टप्रद है, लेकिन आपको बस उन्हें याद रखना होगा): http://vimregex.com/#Non-Greedy

का गैर-लालची संस्करण *है \{-}। तो, बस के .*साथ बदलें .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc

6

मैं हमेशा समस्या को दो चरणों में तोड़ना पसंद करता हूं:

/\v(https?):\/\/(.{-})\/.*        <-- Search
:%s,,Protocol:\1 - Domain:\2,g    <-- Substitution

प्रतिस्थापन में अंतिम खोज को संदर्भित करने और प्रतिस्थापन परिसीमन को बदलने के लिए कई बैकस्लैश से बचने के लिए बहुत जादू "\ v" का उपयोग करना। ये सभी परिवर्तन कोड को अधिक पठनीय बनाते हैं।

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


2

आप [^\]+/.लालच को रोकने के लिए भी उपयोग कर सकते हैं । [^/]मतलब "कुछ भी अपेक्षा से मेल खाता है /, और +एक या अधिक बार दोहराता है ..

:%s!\v^(https?)\://([^/]+)/.*$!Protocol:\1 \t Domain:\2!g

अगर मेरे पास /रेगेक्स है, तो मैं !एक विभाजक के रूप में उपयोग करूंगा ताकि मुझे बचना न पड़े /

उदाहरण

मान लीजिए कि आपके पास निम्न यूआरएल हैं:

http://academy.mises.org/courses/econgd/
http://academy.mises.org/moodle/course/view.php?id=172
http://acmsel.safaribooksonline.com/book/-/9781449358204?bookview=overview
http://acmsel.safaribooksonline.com/home
http://acordes.lacuerda.net/bebo__cigala/lagrimas_negras-2.shtml
http://acordes.lacuerda.net/jose_antonio_labordeta/albada.shtml
http://anarchitext.wordpress.com/category/new-middle-east/
https://courses.edx.org/courses/course-v1%3ADelftX%2BFP101x%2B3T2015/wiki/DelftX.FP101x.3T2015/resources-and-links/
https://cseweb.ucsd.edu/classes/wi11/cse230/lectures.html
https://developer.mozilla.org/en-US/docs/CSS
https://developers.google.com/edu/python
https://developers.google.com/structured-data/testing-tool/

प्रतिस्थापन को लागू करने से आपको यह मिलेगा:

Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:anarchitext.wordpress.com
Protocol:https   Domain:courses.edx.org
Protocol:https   Domain:cseweb.ucsd.edu
Protocol:https   Domain:developer.mozilla.org
Protocol:https   Domain:developers.google.com
Protocol:https   Domain:developers.google.com
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.