क्या विम के रेगेक्स मैजिक प्रसिद्ध रेगेक्स कक्षाओं के साथ संगत हैं?


16

कई यूनिक्स टूल की नियमित अभिव्यक्ति वाक्य रचनाएं अक्सर पॉसिक्स-कोडिफाइड बेसिक और एक्सटेंडेड रेगुलर एक्सप्रेशंस (बीआर और ईआरई, क्रमशः), और, कुछ आधुनिक कार्यान्वयन में, पर्ल-स्टाइल (पीसीआरई का एक कार्यान्वयन है)।

क्या विम के जादू के स्तरों और बाहरी रूप से परिभाषित, लेकिन अच्छी तरह से ज्ञात वर्गों के बीच एक-से-एक पत्राचार है? ऐसा लगता है \mकि BRE है और \vERE है, केवल POSIX में लुकराउंड शामिल नहीं है।

यदि ऐसा कोई पत्राचार मौजूद है, तो क्या यह कहीं परिभाषित है? pattern.txtका केवल एक उल्लेख है POSIX

या क्या हमें Vim नियमित अभिव्यक्ति का वर्णन करने के लिए "जादू" के साथ रहना होगा?


3
बहुत यकीन है कि शब्द सीमाएं \vशामिल <>हैं, जो AFAIK विम के लिए अद्वितीय है। तो नहीं, बस उन्हें "विम रेगेक्स" के रूप में वर्णित करें। (उत्तर के रूप में पोस्टिंग नहीं कर रहा हूं क्योंकि मैं सकारात्मक नहीं हूं)
Doorknob

@Doorknob, मुझे लगता है कि आपको जवाबों की यह चर्चा दिलचस्प लग सकती है। चूंकि आपकी टिप्पणी में तीन बदलाव हैं और कोई भी टिप्पणी आपको यह बताने के लिए प्रतिक्रिया नहीं दे रही है कि यह गलत है, यह शायद सही है (मुझे यकीन नहीं है), लेकिन सुझाए गए संपादन एट। अल। इसकी सटीकता में सुधार करना असंभव है। एक पोस्ट किए गए उत्तर के रूप में, इसे बेहतर सटीकता के लिए संपादित किया जा सकता है, उत्कीर्ण किया जा सकता है, डाउनवोट किया जा सकता है, इसका उत्तर दिया जा सकता है
वाइल्डकार्ड

जवाबों:


22

संक्षेप में, नहीं। विम का रेगेक्स एक अद्वितीय स्वाद है, और इसे और अधिक स्वाद की तरह व्यवहार करने के लिए कोई विकल्प नहीं है।

मुझे लगता है यह एक अच्छी बात है।

जादू

'magic'विकल्प regex का स्वाद नहीं बदलता है कि विम का उपयोग करता है। यह बस कई- \गायब परमाणुओं के व्यवहार का विरोध करता है।

उदाहरण के लिए, डिफ़ॉल्ट रूप से, +एक शाब्दिक +चरित्र है, \+जिसका अर्थ है "पूर्ववर्ती परमाणु का एक या अधिक"। इसके विपरीत, का *अर्थ है "पूर्ववर्ती परमाणु का शून्य या अधिक", जबकि \*एक शाब्दिक है *। कई लोगों को यह काफी भ्रामक लगता है। \vअपने पैटर्न में उपयोग करना इसे थोड़ा अधिक सुसंगत बनाता है। :help 'magic'एक अच्छा सारांश देता है:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

व्यक्तिगत रूप से, मुझे लगता है कि कोड फ़ाइलों के लिए डिफ़ॉल्ट व्यवहार अच्छा है, जहां foo(शाब्दिक का उपयोग करके चीजों की खोज करना असामान्य नहीं है (

विम का अपना रेगीक्स स्वाद

मैंने कई लोगों को देखा है जो विम का समर्थन करते हैं। व्यक्तिगत रूप से, मुझे लगता है कि अन्य उपकरण रेमीक्स के विम के स्वाद का समर्थन करते हैं। इसकी कुछ क्षमताएं हैं जो पीसीआरई में हासिल करने के लिए या तो असंभव हैं या बहुत बोझिल हैं।

पीसीआरई में असंभव

लुकअराउंड एक सामान्य विशेषता है जहां आप यह दावा कर सकते हैं कि जिस पैटर्न को आप मैच करने की कोशिश कर रहे हैं उसके पहले या बाद में एक पैटर्न या तो मेल नहीं खाता है या नहीं। उदाहरण के लिए, PCRE पैटर्न q(?!u)(या Vim regex पैटर्न qu\@!) एक से मेल qनहीं खाता है u। (यह तुलना में अधिक सही है q[^u], जिसके लिए आवश्यक है कि इसके बाद कुछ चरित्र हो q।)

चर-लंबाई नकारात्मक लुकअप

पीसीआरई, और कई अन्य स्वादों में एक प्रतिबंध है कि एक नकारात्मक लुकबाइंड पैटर्न निश्चित लंबाई का होना चाहिए। इसका मतलब है कि एक पैटर्न जैसे (?<![a-z]{3})foo, जिसका अर्थ है "स्ट्रिंग foo जो कि 3 लोअरकेस अक्षरों से पहले नहीं है ") ठीक है, लेकिन (?<![a-z]+)foo(मतलब "स्ट्रिंग किसी भी संख्या के निचले अक्षरों fooसे पहले नहीं है ") नहीं है।

यह प्रतिबंध विम में मौजूद नहीं है। विम में, जैसा पैटर्न \([a-z]\+\)\@<!foo, जबकि देखने में थोड़ा बदसूरत है, पूरी तरह से मान्य है।

विम रीगेक्स में आसान

कुछ चीजें विम के स्वाद में बहुत अच्छे हैं।

मैच एंकर की शुरुआत और अंत

मेरी राय में, सबसे उल्लेखनीय \zsऔर \zeएंकर हैं। ये आपको मैच की शुरुआत और अंत निर्दिष्ट करने की अनुमति देते हैं। उदाहरण के लिए, foo(\zs.*\ze)केवल एक फ़ंक्शन कॉल के बीच (और उसके बीच क्या मेल खाता है । यह पीसीआरई में किया जा सकता है, लेकिन इसमें लुक-अप के उपयोग की आवश्यकता होती है, जो थोड़ा थकाऊ है:)foo(...)(?<=foo\().*(?=\))

उपसर्ग मिलान

एक और अच्छी बात जो विम कर सकती है वह है वर्णों के किसी विशेष क्रम का कोई उपसर्ग (खाली उपसर्ग सहित)। उदाहरण के लिए, पर मैच के लिए f, fo, foo, या food, पैटर्न f\%[ood]इस्तेमाल किया जा सकता। पीसीआरई में, ऐसा पैटर्न दिखेगा f(o(od?)?)?। (एक लंबी स्ट्रिंग के लिए कल्पना कीजिए!)

मिलान कर्सर, रेखा और स्तंभ स्थिति

विम के रेगेक्स में बफर में मिलान स्थितियों के लिए कुछ एंकर हैं।


मुझे लगता है कि रेमीक्स के विम स्वाद को गले लगाने लायक है। यह मुख्य रूप से प्रोग्रामिंग के लिए उपयोग किए जाने वाले पाठ संपादक में उपयोग के लिए अच्छी तरह से अनुकूल है, और यह काफी शक्तिशाली है।

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