क्या वीआईएम के रेगेक्स सिस्टम में बदलाव संभव है?


22

मैंने कई स्थितियों का सामना किया है, जहां लुक-अप स्टेटमेंट्स का होना उपयोगी होगा। मैंने मानक लुकअप सिंटैक्स ( (?=), (?!)आदि ..) का उपयोग करने की कोशिश की है , लेकिन ऐसा प्रतीत होता है कि विम इस का समर्थन नहीं करता है। क्या विम के पास इस प्रकार के कथनों के लिए एक समान वाक्यविन्यास है?

जवाबों:


29

"ज़ूम" लंगर

@ Jecxjo के जवाब के अलावा, कई परिस्थितियां हैं जहां आप शून्य-चौड़ाई वाले एंकर का उपयोग कर सकते हैं \zsऔर \zeइसके बजाय सकारात्मक रूप से देख सकते हैं । ये एंकर पूर्ण पैटर्न के भीतर मैच की शुरुआत ( \zs) और अंत ( \ze) को परिभाषित करते हैं ।

उदाहरण

  • foo\zsbarमैच barसे पहले होगा foo( fooमैच का हिस्सा नहीं)
  • foo\zebarfooइसके बाद मैच होगा bar( barमैच का हिस्सा नहीं)
  • myFunction(\zs.*\ze)एक फ़ंक्शन कॉल में मापदंडों से मेल खाएगा (प्रदर्शन प्रयोजनों के लिए, मैं लालची बनाम गैर-लालची मिलान पर ध्यान केंद्रित नहीं कर रहा हूं)

इसका उपयोग करने के लिए डाल

:substituteकमांड का उपयोग करते समय ये सबसे उपयोगी हो जाते हैं । उदाहरण के लिए, कहते हैं कि मैं करने के लिए एक समारोह कॉल में पैरामीटर को बदलने के लिए करना चाहता था myFunction()के साथ foo:

:%s/myFunction(\zs.*\ze)/foo/

यह छोड़ देगा myFunction(और )बरकरार रहेगा , और आपको उन्हें अपने पैटर्न में कैप्चर करने या अपने प्रतिस्थापन में दोहराने की चिंता करने की आवश्यकता नहीं है ।

आप विम के रेगेक्स के लुकअवेशन फीचर का उपयोग करके ऐसा कर सकते हैं, लेकिन यह काफी क्लिंकी है:

:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/

(मुझे लगता है कि यह वाक्यविन्यास मुझे भूल जाता है कि मैं पहली जगह में क्या करने की कोशिश कर रहा था।)

आपको अभी भी कभी-कभी देखने की आवश्यकता है

अभी भी ऐसी स्थितियाँ हैं जहाँ आपको नज़र रखने की ज़रूरत है। का उपयोग करते हुए \zsऔर \zeजहां आप साधारण स्थितियों के लिए महान हैं इससे पहले कि कुछ के बाद पाठ से मेल करने के लिए के बाद के बाद कुछ । लेकिन अगर यह उससे अधिक जटिल है, तो आपको संभवतः भारी लयबद्ध वाक्य रचना से चिपके रहना होगा।

मजेदार तथ्य

हालांकि वे काफी बदसूरत हैं, PC में उन लोगों की तुलना में Vim का लुकअप अधिक शक्तिशाली है! वे चर-लंबाई के नकारात्मक लुकअप का समर्थन करते हैं, जिसका अर्थ है कि आप यह दावा कर सकते हैं कि कुछ पैटर्न जिनकी लंबाई पूर्व निर्धारित नहीं है, आपके मैच से पहले नहीं है

PCRE इसका समर्थन नहीं करता है, क्योंकि यह काफी कम्प्यूटेशनल रूप से महंगा है। विम में यह बहुत बड़ी चिंता का विषय नहीं है, क्योंकि रेगेक्स के सबसे आम उपयोग के मामलों में इंटरएक्टिव खोज शामिल है जहां गणना समय उपयोगकर्ता के लिए लगभग अस्वीकार्य है। यदि आप इसे सिंटैक्स हाइलाइटिंग के लिए उपयोग किया गया था, तो आप शायद इसे नोटिस करेंगे।

प्रासंगिक सहायता विषय

  • :help \zs
  • :help \ze
  • :help perl-patterns

मुझे ज़ूम एंकर के बारे में पता नहीं था। उन्हें समझाने के लिए धन्यवाद।
एवरग्रीनट्री

14

ऐसा लगता है कि यह संभव है। पेर से विम तक जाने के लिए एक सरल तालिका है।:h perl-patterns

9. Compare with Perl patterns               *perl-patterns*

Vim's regexes are most similar to Perl's, in terms of what you can do.  The
difference between them is mostly just notation;  here's a summary of where
they differ:

Capability                  in Vimspeak   in Perlspeak
----------------------------------------------------------------
force case insensitivity    \c            (?i)
force case sensitivity      \C            (?-i)
backref-less grouping       \%(atom\)     (?:atom)
conservative quantifiers    \{-n,m}       *?, +?, ??, {}?
0-width match               atom\@=       (?=atom)
0-width non-match           atom\@!       (?!atom)
0-width preceding match     atom\@<=      (?<=atom)
0-width preceding non-match atom\@<!      (?<!atom)
match without retry         atom\@>       (?>atom)

इसलिए उदाहरण के लिए यदि आपके पास स्ट्रिंग है one two threeऔर आप oneकेवल उसी के लिए मिलान करना चाहते हैं यदि <space>twoआप इसका उपयोग कर सकते हैं

/one\(\stwo\)\@=

यह पर्ल संस्करण के समान है

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