दृश्य स्टूडियो में बहु-पंक्ति नियमित अभिव्यक्ति


87

क्या रीजैक्स को कई लाइनों में बदलने के लिए विजुअल स्टूडियो प्राप्त करने का कोई तरीका है (मैच क्रॉस लाइन की सीमाओं को दें)? मुझे पता है कि कई संपादक हैं जो मैं इसके लिए उपयोग कर सकता हूं, लेकिन यह अजीब लगता है कि इस सुविधा को विज़ुअल स्टूडियो से छोड़ दिया गया है। क्या मैं कुछ भूल रहा हूँ?

जवाबों:


25

फ़ाइलें संवाद में की जगह का उपयोग करें Ctrl- Shift- Hऔर एक पंक्ति विकल्प (?s):

(?s)start.*end

पाता

start
two
three
end

सिंगललाइन का अर्थ है: प्रत्येक फ़ाइल को सिंगल लाइन के रूप में माना जाता है, डॉट .न्यूलाइन से मेल खाता है \n। डाउनसाइड: आपको फाइंड ऑल का उपयोग करना चाहिए और सभी को बदलना चाहिए , या हाथ से बदलना चाहिए। अगला खोजें काम नहीं करता है।

गैर-मोडल संवाद के लिए Ctrl- Hऔर अगली खोज करें, (.*\n)*किसी भी संख्या में रेखाओं का मिलान करने के लिए उपयोग करें:

start(.*\n)*.*end

किसी भी तरह से, आप अपने निष्कर्षों को सम्मिलित करके कई पंक्तियों के साथ बदल सकते हैं \n


यह काम करता है लेकिन आप अतिरिक्त प्रश्न चिह्न चाहते हैं (पहले end) तो यह लालची नहीं है। यानी:start(.*\n)*.*?end
सीएडी

4
लालची संस्करण के बीच startऔर संभव के रूप में कई पात्रों के साथ मेल खाता है end। यदि आप endगैर-लालची संस्करण का अगला उपयोग करना चाहते हैं : (?s)start.*?endया start(.*\n)*?.*?end
स्टीफन स्टैम

उपयोगकर्ता के लिए ध्यान दें: विजुअल स्टूडियो 2013 के बाद से काम नहीं करता है। जाइल्स रॉबर्ट्स का जवाब देखें।
अपेक्षाकृत_ब्रांड

@relatively_random: क्या आपको उपयोग करने में परेशानी हुई (?s)?
स्टीफन स्टैम

हाँ, मैंने किया। क्या यह अभी भी नए VS संस्करणों पर आपके लिए काम करता है?
अपेक्षाकृत_ब्रांड

72

विजुअल स्टूडियो 2013 में नियमित अभिव्यक्ति बदल गई है । https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

अब दो लाइनों पर एक अभिव्यक्ति का मिलान करने के लिए कोड होगा:

StartOfExpression.*\r?\n.*EndOfExpression


धन्यवाद, यह पूरी तरह से काम करता है, </label>.*\r?\n.*<divजहां \r?\nस्पष्ट carriage_return-new_line है और .*संभावित टैब / रिक्त स्थान के मिलान के लिए
सैम

मुझे वर्तमान में "लिटरल '\ n' की त्रुटि नहीं
मिली है

@ ELI7VH मैं आपकी त्रुटि को दोहरा नहीं सकता। विजुअल स्टूडियो के कौन से संस्करण का आप उपयोग कर रहे हैं?
गिल्स रॉबर्ट्स

25

यह आज विजुअल स्टूडियो 2012 में काम करता है:

fooPatternToStart.*(.*\n)+?.*barPatternToEnd

देखें कि कैसे (.*\n)+?भाग कई रेखाओं में मेल खाता है, गैर-लालची।
fooPatternToStartआपकी शुरुआत की रेखा पर कुछ रेगेक्स पैटर्न है, जबकि barPatternToEndनीचे एक और रेखा पर खोजने के लिए आपका पैटर्न है, संभवतः नीचे कई लाइनें ...

उदाहरण यहां मिला ।

सरल और प्रभावी :)

नोट: VS2012 से पहले , जो पैटर्न काम करता था वह था:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
दृश्य स्टूडियो ध्यान दें 2012 का उपयोग करता है एक ही regex इंजन खोजने के लिए / कोड के भीतर के रूप में बदलने के है, इसलिए ऊपर हो जाता है: fooPatternToStart * * * barPatternToEnd। (* \ N।)।
ब्रेंट

@ बेंट: दी गई, वीएसटीओ के अधिक हाल के संस्करणों ने उस मुद्दे को ठीक कर दिया है।
वूहो

क्या होगा यदि मैं विशेष रूप से प्रारंभ और रोक के बीच एक पाठ की खोज करना चाहता हूं? इस तरह? : संपादित करें: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__के logबीच sprintfऔर __func__, के लिए खोज करने के लिए काम करता है धन्यवाद! थो .. यह उस के लिए अनंत में लग रहा है .. अगर वहाँ केवल लाइनों की मात्रा को सीमित करने के लिए एक तरीका था
Gizmo

19

नोट: यह उत्तर विजुअल स्टूडियो में उपयोग किए गए regex सिंटैक्स का उपयोग कर रहा है जिसमें VS 2012 शामिल है। VS 2013 और बाद में, रेगेक्स सिंटैक्स बदल गया है।

आप \nअभिव्यक्ति में शामिल कर सकते हैं । एक उदाहरण के रूप में, यहाँ एक regex है जिसका उपयोग मैं किसी भी संग्रहीत प्रक्रिया से स्वतः-उत्पन्न SQL स्क्रिप्ट को "साफ़" करने के लिए करता हूं जो कि एक संग्रहीत कार्यविधि से मेल नहीं खाती है (यह "ऑब्जेक्ट:" वाली पंक्ति से शुरू होने वाले पाठ ब्लॉक से मेल खाएगी, जो ऐसा नहीं है "StoredProcedure", फिर एक लाइन तक निम्नलिखित पंक्तियों का मिलान "GO" शब्द से होता है):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n

नोट: लाइन टर्मिनेटर फ़ाइल के प्रारूप पर निर्भर करता है, इसलिए यूनिक्स स्टाइल टेक्स्ट के लिए केवल \ n, मैक स्टाइल टेक्स्ट के लिए \ r, या विंडोज़ स्टाइल टेक्स्ट के लिए \ n \ n का उपयोग करें।
जेम्स विल्किंस

2
नोट II: सुनिश्चित करें कि आपके पास एक ही समय में "मिलान पूरे शब्द" नहीं है, अन्यथा यह काम नहीं करता है!
एड ग्राहम

1
क्या आप यह कहते हुए एक नोट जोड़ सकते हैं कि यह उत्तर केवल विजुअल स्टूडियो 2012 और पुराने कृपया पर लागू होता है?
गाइल्स रॉबर्ट्स

3

आपको अपनी अभिव्यक्ति के अंत में \ r \ n का उपयोग करने की आवश्यकता हो सकती है।


1

गैर-लालची मल्टी-लाइन किसी भी चरित्र पर कब्जा, दृश्य स्टूडियो 2013+:

.*?\r?\n.*?

जाइल्स रॉबर्ट्स के जवाब में लालची संस्करण।


0

वीएस कोड की खोज करते समय यहां आने वाले सभी के लिए, मैं इसका उपयोग script2 नईलाइन्स (अपवर्जित किए गए न्यूलाइन) के साथ कहीं से भी मैच करने के लिए करता हूं :

script(.|\n)+?(?=\n\n)

बदलें scriptऔर \n\nउन दोनों के बीच सब कुछ मैच करने के लिए।

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