2011-11-23 13 views
5

System.Text.RegularExpressions.Regex.Escape() केवल ब्रेसिज़ खोलने से बच निकलता है। क्या कोई .NET Framework विधि है जो regex में उपयोग के लिए बंद ब्रेसिज़ से बचती है? मुझे कोई नहीं लगता है। मैं पात्रों को हार्डकोड करने से नफरत करता हूं।बंद ब्रेसिज़ से बचने

संपादित करें: मुझे समूह परिभाषाओं को संतुलित करने के लिए "(? < -open>)" टैग उत्पन्न करने की आवश्यकता है। मुझे बंद करने वाले डिलीमीटर का प्रतिनिधित्व करने वाले पात्रों की एक सूची प्राप्त होती है, उन्हें बचें और फिर उन्हें "(? < -open>)" टैग में अभिव्यक्ति में जोड़ें। तो, हाँ, मुझे वास्तव में बंद ब्रेसिज़ से बचने के लिए भी करना है।

+2

एमएसडीएन का कहना है कि "यदि एक समापन ब्रैकेट या ब्रेस इसके संबंधित उद्घाटन चरित्र से पहले नहीं है, तो नियमित अभिव्यक्ति इंजन इसे शाब्दिक रूप से व्याख्या करता है"। क्या आप वाकई इसे बंद करने वाले ब्रेसिज़ से बचने की ज़रूरत है? –

+0

@ टिमबोरगुइनन: मुझे लगता है कि आप इसे यहां एक उत्तर के रूप में भी डाल सकते हैं। –

उत्तर

1

Regex.Escape जब मैं कोशिश करता हूं तो दोनों से बच निकलता है। क्या आपके कोड में कुछ और चल रहा है? आपके बचने वाले कोड और रेगेक्स दोनों का पुनरुत्पादन उदाहरण पोस्ट करना सहायक होगा। मुझे लगता है कि टिम की टिप्पणी शायद इस बात पर भी है कि क्या हो रहा है।

Regex.Escape("(Hello)"); // \(Hello\) 
Regex.Escape("Hello)"); // Hello\) 
Regex.Escape("(Hello"); // \(Hello 

संपादित करें::

Fwiw, Regex.Escape परीक्षण() इन परिणाम देता है टिप्पणी मैं समझता हूँ कि आप का मतलब से ठीक {अब, और कहा कि के साथ परीक्षण के परिणाम तुम कह रहे हो देता है। Regex.Escape() आवश्यकता होने पर केवल बचने में मदद करने की कोशिश कर रहा है, लेकिन यदि आप यहां नहीं चाहते हैं तो कोई अन्य अंतर्निहित विधि नहीं है जो काम करेगी। मुझे लगता है कि आपको 1 करना होगा) अपने आप में लापता होने से बचें, या 2) यदि संभव हो, तो अपनी इनपुट स्ट्रिंग को अलग-अलग प्रारूपित करें ताकि Regex.Escape अपेक्षा के अनुसार काम करेगा।

+0

मजेदार बात। जब मैंने एक ही चीज़ की कोशिश की, तो दूसरा परिणाम "हैलो" था। हम्म। अजीब। – dijxtra

+0

वे ब्रांड्स हैं (ए.के.ए. राउंड ब्रैकेट्स); स्क्वायर ब्रैकेट या घुंघराले ब्रैकेट के साथ इसे आज़माएं (आम तौर पर लोगों को मेरे अनुभव में "ब्रेसिज़" का क्या मतलब है), और आप देखेंगे कि यह केवल शुरुआती भाग से बच निकलता है। –

+0

ओह, डबल चेक किया गया, हाँ, मैंने अपने उदाहरण में स्क्वायर ब्रैकेट का उपयोग किया। – dijxtra

4

के रूप में टिप्पणी में कहा ऊपर, भागने समारोह के व्यवहार के रूप में इस प्रकार है (MSDN) है:

वर्ण (\, *, +,, का एक न्यूनतम सेट पलायन |, {, [? , (,), ^, $,।, #, और सफेद स्थान) उन्हें अपने भागने के कोड के साथ बदलकर। यह नियमित रूप से अभिव्यक्ति इंजन को इन वर्णों को व्याख्यात्मक रूप से मेटाएक्टएक्टर्स की बजाय व्याख्या करने के लिए निर्देशित करता है।

निम्नलिखित टिप्पणी जोड़ा जाता है: पलायन विधि सीधे प्रारंभ कोष्ठक ([) निकल जाता

जबकि और उद्घाटन ब्रेस ({) वर्ण, यह उनकी संगत समापन वर्ण से बचें नहीं करता है (] और})। ज्यादातर मामलों में, इनसे बचना जरूरी नहीं है। यदि कोई समापन ब्रैकेट या ब्रेस इसके संबंधित उद्घाटन चरित्र से पहले नहीं है, तो नियमित अभिव्यक्ति इंजन इसे सचमुच का अर्थ देता है। यदि एक उद्घाटन ब्रैकेट या ब्रेस को मेटाएक्टेक्टर के रूप में व्याख्या किया जाता है, तो नियमित अभिव्यक्ति इंजन पहले संबंधित समापन चरित्र को मेटाएक्टेक्टर के रूप में व्याख्या करता है। यदि यह वांछित व्यवहार नहीं है, तो क्लोजिंग ब्रैकेट या ब्रेस को बैकस्लैश() वर्ण को स्पष्ट रूप से पूर्ववत करके बच जाना चाहिए। एक उदाहरण के लिए, उदाहरण खंड देखें।

इस प्रकार दुभाषिया एक } कि एक उद्घाटन { यह स्वतः यह बच जाएगा से पहले नहीं कर रहा है यह पता लगता है।

+0

मुझे इसके बारे में पता है। लेकिन, मैंने यह नहीं पूछा :-) वैसे भी, आपके उत्तर के लिए धन्यवाद, यहां प्रयास के लिए एक उत्थान है। – dijxtra

+0

उपरोक्त के लिए धन्यवाद। मुझे लगता है कि सबसे अच्छी बात यह है कि रेगेक्स क्लास को अपने स्वयं के एस्केप एक्स्टेंडेड() फ़ंक्शन के साथ उन अतिरिक्त पात्रों की देखभाल करना होगा; लेकिन यह बहुत कठिन है जो आप नहीं करना चाहते थे। –

+0

हाँ, मैंने ऐसा करने के लिए पहले से ही एक निजी स्थैतिक विधि लिखी है, इसे रेगेक्स कक्षा में जोड़ने की आवश्यकता नहीं है। तो अब मैं एक और सुरुचिपूर्ण समाधान की तलाश में हूं ... – dijxtra

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