2009-11-25 12 views
13

में स्ट्रैब नहीं होने वाली सभी पंक्तियों को कैसे पुनर्प्राप्त करें, मैं विजुअल स्टूडियो सर्च बॉक्स में "strA" युक्त दस्तावेज़ की सभी पंक्तियों को कैसे प्राप्त कर सकता हूं, लेकिन "strb" नहीं?Regex: Visual Studio

+4

आप पर यह क्या कर रहे हैं।।। एक कमांड लाइन, या कुछ कोड में? कौन सा ओएस या भाषा? –

+1

दृश्य स्टूडियो खोज बॉक्स में। – Ricky

उत्तर

1

आप Negative lookarounds का उपयोग करेंगे, लेकिन अगर आप शर्तों की अपेक्षित स्थिति (या यहां तक ​​कि ऑर्डर) नहीं जानते हैं तो अभिव्यक्ति बहुत जटिल है। क्या आप ऑर्डर या पैटर्न जानते हैं?

अन्यथा मैं एक उपकरण का उपयोग करने के लिए आपको सलाह देते हैं कि जो कर सकता था उतनी ही आसानी से पाश (या सूची कंप्यूटर अनुप्रयोग) लाइन द्वारा एक फ़ाइल लाइन के माध्यम से और कर Instr या शामिल या अन्य सरल, तेजी, तार्किक परीक्षण ...

+0

मेरे मामलों के लिए कोई पैटर्न नहीं, मुझे लगता है। मुझे आश्चर्य है कि यह सरल सवाल रेगेक्स के लिए इतना मुश्किल है। – Ricky

+0

समस्या तर्क – annakata

23

Visual Studio 2012 के लिए (और नए संस्करणों):

^(?!.*strB).*strA.*$ 

स्पष्टीकरण:

^   # Anchor the search at the start of the line 
(?!.*strB) # Make sure that strB isn't on the current line 
.*strA.* # Match the entire line if it contains strA 
$   # Anchor the search to the end of the line 

यदि आप गाड़ी रिटर्न/लाइन फ़ीड्स को शेष लाइन के साथ भी हटाना चाहते हैं तो आप रेगेक्स के अंत में (?:\r\n)? जोड़ना चाहेंगे।

+5

व्यक्त कर रहा है यह काम किया। मुझे बहिष्करण के लिए कई तारों का समर्थन करने के लिए विस्तार करना पड़ा, जो कि उदाहरण के लिए काम करता था। '^ (?!। * STRB) (?!। * STRC) (?!। * StrD)। * Stra। * $'। – DuckMaestro

1

मुझे लगता है कि खोज बॉक्स वास्तव में सामान्य नियमित अभिव्यक्ति स्वीकार करता है। नकारात्मक अग्रदर्शी का उपयोग करना:

(?!^.*strB.*$)strA 

आप बहु विकल्प (शुरू में ^ और $ मैच लाइनों के/अंत) स्थापित करने के लिए की आवश्यकता होगी। आप संवाद विकल्पों का उपयोग कर यह निर्धारित नहीं कर सकते हैं, तो कोशिश:

(?m)(?!^.*strB.*$)strA 

यह शायद है कि इंजन में डिफ़ॉल्ट मोड हालांकि है।

+0

आपको पूरे रेगेक्स को एंकर करने की ज़रूरत है, न केवल लुकहेड। इसका मतलब है ''' '* बाहर * लुकहेड डालना और' strA' के सामने एक और '। *' जोड़ना। लेकिन रेखा के * अंत * (यानी, '। * $' जा सकते हैं) के रेगेक्स के किसी हिस्से को एंकर करने की आवश्यकता नहीं है। –

+0

अच्छी तरह से मुझे नहीं पता। जैसा कि मैंने इसे अभी देखा है, मैंने इसे लिखा है "यदि एक पंक्ति में स्ट्रोब नहीं है, तो stra से मिलान करें"। अभी भी मेरे लिए सही लगता है, क्योंकि हम लाइन से लाइन से मेल खाते हैं। मुझे लगता है। पुराने regexes पढ़ना मेरे दिमाग को चोट पहुंचाता है। – wds

16

दृश्य स्टूडियो 2010 (और पिछले संस्करणों) के लिए:

दृश्य स्टूडियो खोज बॉक्स का अपना, regex वाक्य रचना की विचित्र संस्करण है। यह अभिव्यक्ति का अनुरोध किया के रूप में काम करता है:

^~(.*strB).*strA 

^ एक पंक्ति के आरंभ से मेल खाता है। (आमतौर पर एक पाठ संपादक के लिए, वहाँ कोई "बहु" विकल्प है,। ^ और $ हमेशा लाइन सीमा पर से मेल खाते हैं)

. एक नई पंक्ति को छोड़कर किसी भी चरित्र से मेल खाता है। (ऐसा नहीं है, ऐसा नहीं लगता है कि कोई "सिंगल-लाइन" या "डॉट-ऑल" मोड नहीं है जो डॉट्स को न्यूलाइन से मेल खाता है।)

~(...) "रोकथाम मैच" निर्माण, बराबर है (जहां तक ​​मैं कह सकता हूं) नकारात्मक प्रतिक्रिया के लिए ((?!...)) अन्य उत्तरदाताओं द्वारा उपयोग किया जाता है।

+4

एफवाईआई, विजुअल स्टूडियो 2012 के रूप में डॉटनेट रीगेक्स इंजन अब खोजों के लिए उपयोग किया जाता है, इसलिए विचित्र वाक्यविन्यास अब जाना चाहिए। अच्छा जवाब है, लेकिन बस इस बात से अवगत रहें कि आप किस वीएस का उपयोग कर रहे हैं। – redcalx

+0

विजुअल स्टूडियो 2010 SP1Rel में परीक्षण, यह उत्तर संशोधित किया जाना चाहिए यदि "strB" "strA" के बाद हो सकता है। '^ ~ (। * StrB) आज़माएं। * StrA ~ (। * Strb)'। या '~ (strb)। * StrA। * ~ (Strb)'। – ToolmakerSteve

0

यह दृश्य स्टूडियो 2010 के साथ मेरे लिए काम किया:।

^+ [^ (STRB)] (Stra) + [^ (STRB)] + $

संबंधित मुद्दे