2013-01-18 32 views
12

से एकाधिक जोड़े वाले कोष्ठक को कैसे हटाएं मैं एक स्ट्रिंग से जोड़े गए कोष्ठक के सभी उदाहरणों को हटाने के लिए सी # नियमित अभिव्यक्तियों का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं। कोष्ठक और उनके बीच सभी पाठ हटा दिया जाना चाहिए। कोष्ठक हमेशा एक ही पंक्ति पर नहीं होते हैं। इसके अलावा, उनकी घोंसला वाले कोष्ठक हो सकते हैं। स्ट्रिंग का एक उदाहरणसी # रेगेक्स - स्ट्रिंग

This is a (string). I would like all of the (parentheses 
to be removed). This (is) a string. Nested ((parentheses) should) also 
be removed. (Thanks) for your help. 

वांछित आउटपुट इस प्रकार होना चाहिए होगा:

This is a . I would like all of the . This a string. Nested also 
be removed. for your help. 
+1

क्या आप अपना वांछित आउटपुट जोड़ सकते हैं? –

+0

निश्चित रूप से। मैं पोस्ट अपडेट करूंगा। –

+1

... या यहां: http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns –

उत्तर

21

सौभाग्य से, नेट regexes में प्रत्यावर्तन (Balancing Group Definitions देखें) की अनुमति देता है:

Regex regexObj = new Regex(
    @"\(    # Match an opening parenthesis. 
     (?>    # Then either match (possessively): 
     [^()]+   # any characters except parentheses 
     |    # or 
     \((?<Depth>) # an opening paren (and increase the parens counter) 
     |    # or 
     \) (?<-Depth>) # a closing paren (and decrease the parens counter). 
    )*    # Repeat as needed. 
    (?(Depth)(?!)) # Assert that the parens counter is at zero. 
    \)    # Then match a closing parenthesis.", 
    RegexOptions.IgnorePatternWhitespace); 

में अगर कोई सोच रहा है: "पैरों का काउंटर" शून्य से नीचे कभी नहीं जा सकता है (<?-Depth> अन्यथा विफल हो जाएगा), इसलिए यदि ब्रांड्स "संतुलित" हैं, लेकिन सही ढंग से मेल नहीं खाते हैं (()))((() की तरह), यह regex बेवकूफ नहीं किया जाएगा।

अधिक जानकारी के लिए आप बार-बार, हालांकि रिक्त स्ट्रिंग के साथ /\([^\)\(]*\)/g की जगह ले सकता जब तक कोई और अधिक मिलान नहीं पाए जाते जेफरी फ़्रिड्ल उत्तम पुस्तक "Mastering Regular Expressions" (पी। 436)

+0

बहुत अच्छा समाधान – msmucker0527

+0

यह पूरी तरह से काम किया! धन्यवाद! –

+0

@ मैटब्रैंडन - .NET: [संतुलन समूह परिभाषाओं] में ऐसा करने का एक और आसान तरीका है (http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition)। – JDB

0

इस बारे में: Regex Replace चाल चल रहा है।

string Remove(string s, char begin, char end) 
{ 
    Regex regex = new Regex(string.Format("\\{0}.*?\\{1}", begin, end)); 
    return regex.Replace(s, string.Empty); 
} 


string s = "Hello (my name) is (brian)" 
s = Remove(s, '(', ')'); 

आउटपुट होगा:

"Hello is" 
+0

मुझे लगता है कि आप 'Regex.Escape()' '\\ {0}" ' – JDB

1

आम तौर पर, यह एक विकल्प नहीं है। हालांकि, माइक्रोसॉफ्ट के मानक नियमित अभिव्यक्तियों के लिए कुछ एक्सटेंशन हैं। आप Grouping Constructs के साथ इसे प्राप्त करने में सक्षम हो सकते हैं, भले ही यह उनके विस्तार के माइक्रोसॉफ्ट के स्पष्टीकरण को पढ़ने और समझने के बजाय एल्गोरिदम के रूप में कोड के लिए तेज़ हो।

+0

" का उपयोग करके बेहतर होगा, मैं वास्तव में काम करने के लिए एल्गोरिदम को कोड करके आज इस समस्या को हल कर रहा हूं। हालांकि, इसने मुझे अहंकार साझा करने के लिए Regex –

+0

देखभाल के साथ किया जा सकता है या नहीं, यह बहुत उत्सुकता से बचा है? – Zibri