मैं अपने मैच को गैर-लालची कैसे बना सकता हूं?


479

मेरे पास एक बड़ी HTML फ़ाइल है जिसमें बहुत सारे मार्कअप हैं जो इस तरह दिखते हैं:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

मैं एक विम करने के लिए कोशिश कर रहा हूँ खोज एवं प्रतिस्थापन सब से छुटकारा पाने के class=""और style=""लेकिन मैं मुसीबत मैच ungreedy बनाने आ रही है।

मेरा पहला प्रयास यही था

%s/style=".*?"//g

लेकिन विम को पसंद नहीं लगता है ?। दुर्भाग्य से ?मैच को लालची बना देता है।

मैं अपने मैच को कैसे अस्वाभाविक बना सकता हूं?


मुझे लगता है कि पॉल का जवाब अच्छा है। सिर्फ इतना कहने के लिए ""? vim में वैकल्पिक का मतलब नहीं है (यदि यह है कि आप क्या उपयोग करना चाहते हैं? ")
LB40

14
@ एलबी, कई भाषाओं में। *। मतलब किसी भी चरित्र से मेल खाते हैं लेकिन गैर-लालची हैं। यही वह हासिल करने की कोशिश कर रहा है।
रैंडी मॉरिस

जवाबों:


734

.*उपयोग के बजाय .\{-}

%s/style=".\{-}"//g

और देखें :help non-greedy


37
बहुत सहज नहीं है, यह कुछ ऐसा है जो केवल विम करता है?
एहतेश चौधरी

94
हर चीज की अपनी नियमित अभिव्यक्ति भाषा होती है ... जो रेगेक्स के साथ सबसे बड़े मुद्दों में से एक है।
पैट्रिक फैरेल

35
इन उपकरणों के बहुत सारे एक ही समय के आसपास परिपक्व हो गए और स्वतंत्र रूप से एक नियमित अभिव्यक्ति भाषा की अपनी बोली विकसित की। इनमें से कई उपकरण अलग-अलग समस्याओं को हल करने की कोशिश कर रहे थे, इसलिए यह समझ में आता है कि सिंटैक्स-पूरी तरह से बेतहाशा-अलग-अलग हो सकता है। हमें यह स्वीकार करना होगा कि यह वास्तविक दुनिया कैसे काम करती है भले ही यह कभी-कभी हमारे जीवन को डेवलपर्स के रूप में कठिन बना देती है। सौभाग्य से कई उपकरण कम से कम इन दिनों रेग्क्स के पर्ल-संगत कार्यान्वयन प्रदान करते हैं। दुर्भाग्य से विम उनमें से एक नहीं है।
रैंडी मॉरिस

15
यदि आपके जैसा कोई भी अपनी खोज को \v(बहुत ही जादुई ध्वज) को डिफॉल्ट करता है, तो आप उसका उपयोग करना चाहते हैं .{-}
jgillman

48
@Shurane @Ziggy Mnemonic: {1,3}करता है (ब्रेसिज़) की तरह पुनरावृत्ति की संख्या को नियंत्रित करता है। माइनस साइन का -मतलब है: जितना संभव हो उतना कम दोहराएं (छोटा == माइनस);)
सिरो सेंटिल्ली 病:::

58

Vim में गैर लालची खोज {-} ऑपरेटर का उपयोग करके की जाती है। ऐशे ही:

%s/style=".\{-}"//g

कोशिश करो:

:help non-greedy


17

यदि आप अधिक आरामदायक हैं PCRE regex सिंटैक्स, जो

  1. गैर-लालची ऑपरेटर का समर्थन करता है?, जैसा कि आपने ओपी में पूछा था; तथा
  2. बैकवॉकिंग ग्रुपिंग और कार्डिनैलिटी ऑपरेटरों की आवश्यकता नहीं है (जब से आप शाब्दिक वर्णों का मिलान नहीं कर रहे हैं, लेकिन आपरेटरों को निर्दिष्ट कर रहे हैं); तथा
  3. आपके पास perl सुविधा के साथ [g] विम संकलित है, परीक्षण का उपयोग करके

    : सुविधाओं का निरीक्षण और निरीक्षण; अगर + पर्ल वहाँ जाना अच्छा है)

का उपयोग करके खोज / बदलें का प्रयास करें

:perldo s///

उदाहरण। स्वैप टैग और img टैग में सभी विशेषताएँ:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

1
perldoमहान काम करता है, लेकिन दुर्भाग्य से रेगेक्स टाइप करते समय चयनित परीक्षा को उजागर नहीं करता है।
mljrg

12

मैंने पाया है कि इस प्रकार के प्रश्न का एक अच्छा समाधान है:

:%? सड ...

(या यदि आप चाहें तो पर्ल) IOW, vim के regex peculiarities को सीखने के बजाय, एक उपकरण का उपयोग करें जिसे आप पहले से जानते हैं। पर्ल का उपयोग करना होगा? संशोधक मैच को कम करने का काम करते हैं।


2
अच्छी बात है, लेकिन /patternयह जांचने में सक्षम है कि आप इसे लागू करने से पहले पैटर्न को सही ढंग से मिलान कर रहे हैं और cअपनी नियमित अभिव्यक्ति में संशोधक का उपयोग कर रहे हैं, यह भी अच्छा है :)
João Portela

यह सही है। यहाँ सभी समाधान गैर-लालची के करीब नहीं हैं! यदि आपको बहुत सारे पाठ और उस पैटर्न के कई घटनाओं के साथ एक पंक्ति में [0-9] \ {7} मेल करना है, तो यहां कोई समाधान नहीं होगा। यहां समाधान केवल सरल चीजों के लिए काम करते हैं (जो निष्पक्ष होना है, जो पूछा गया था)। लेकिन अगर आप अगले उद्धरण तक खोज से थोड़ा अधिक कर रहे हैं, तो विम मदद नहीं करेगा।
जीसीबी २ g

4

के साथ \v(जैसा कि कई टिप्पणियों में सुझाव दिया गया है)

:%s/\v(style|class)\=".{-}"//g

2

प्लगइन eregex.vim पर्ल-स्टाइल नॉन-लालची ऑपरेटरों *?और संभालता है+?


@xsilenT github.com/othree/eregex.vim : "यह वैन्डल या रोगज़नक़ का उपयोग करके स्क्रिप्ट स्थापित करने के लिए अनुशंसित है।"
eXe

इसके लिए खेद है कि मैं नहीं जानता कि कैसे वंडले या रोगज़नक़ का उपयोग किया जाए।
xililen T

-4

अच्छा दिन,

विम का रीजैक्सप प्रोसेसिंग बहुत शानदार नहीं है। मैंने पाया है कि sed के लिए regexp सिंटैक्स vim की क्षमताओं के लिए सही मिलान के बारे में है।

मैं आमतौर पर सर्च हाइलाइटिंग सेट करता हूं (: सेट hlsearch) और फिर सर्च मोड में प्रवेश करने के लिए स्लैश में प्रवेश करने के बाद regexp के साथ खेलते हैं।

संपादित करें: मार्क, कि लालची मिलान को कम करने की चाल भी डेल डौबर्टी की उत्कृष्ट पुस्तक "सेड एंड ऑक" ( sanitized Amazon लिंक ) में शामिल है।

अध्याय तीन "अंडरस्टैंडिंग रेग्युलर एक्सप्रेशन सिंटैक्स", सीड और ऑक से जुड़ी अधिक आदिम रीजैक्स क्षमताओं का एक उत्कृष्ट परिचय है। केवल एक छोटा पढ़ा और अत्यधिक अनुशंसित है।

HTH

चियर्स,


7
विम का रेगेक्स प्रसंस्करण वास्तव में काफी अच्छा है। यह उन चीज़ों को कर सकता है जो sed नहीं कर सकते हैं, जैसे कि लाइन / कॉलम नंबर पर मिलान या वर्णों के प्रति-भाषा वर्गीकरण पर आधारित कीवर्ड या पहचानकर्ता या व्हाट्सएप। इसमें शून्य-चौड़ाई के दावे और प्रतिस्थापन के दाईं ओर में भाव रखने की क्षमता भी है। यदि आप इसका उपयोग करते हैं तो \vयह सिंटैक्स को बहुत साफ करने में मदद करता है।
ब्रायन कारपर

1
@ ब्रायन, चीयर्स। मैं एक मदद regex करूँगा और देखूंगा कि मुझे क्या याद आ रहा है।
रोब वेल्स

@ रॉबल्स, सेड और ऑक, जो वास्तव में एक बहुत अच्छी किताब इमो है, स्पष्ट रूप से लालची / आलसी क्वांटिफायर पर कोई भी शब्द खर्च नहीं करता है। एक प्रमाण के रूप में, पुस्तक में लालच या लालची शब्द की बिल्कुल कोई घटना नहीं है , और आलसी शब्द की केवल एक, लेकिन असंबंधित, घटना है ।
एनरिको मारिया डी एंजेलिस

@EnricoMariaDeAngelis यह है, लेकिन उदाहरण स्पष्ट रूप से शब्द का संदर्भ नहीं देता है। यह गैर लालची मैचों को प्राप्त करने के लिए "नहीं" ऑपरेटर का उपयोग करने के लिए अपने रेगेक्स को दर्जी करने के बारे में है। लालची और आलसी शब्द पर्ल के एनएफए इंजन के साथ पहुंचे, जब उन्होंने विशेष रूप से लालची मैच व्यवहार को संशोधित करने के लिए ऑपरेटरों को पेश किया।
रॉब वेल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.