2011-06-05 9 views
5

असल में, मेरा लक्ष्य अंदर के तारों को छोड़कर() के अंदर सब कुछ को हटाना है।दो अक्षरों के बीच सबकुछ हटाएं जब तक कि वे कुछ अन्य अक्षरों के अंदर नहीं हैं

मैं कोड यहाँ पीछा कर रहा था: Remove text in-between delimiters in a string (using a regex?)

और वह अच्छा काम करता है; लेकिन अगर मेरे पास "" हैं तो उन्हें हटाने की अतिरिक्त आवश्यकता नहीं है। क्या वह ऐसा कुछ है जो नियमित अभिव्यक्ति के साथ किया जा सकता है। मुझे लगता है कि मैं एक असली पार्सर जैसे किसी अन्य दृष्टिकोण की आवश्यकता के लिए खतरनाक रूप से करीब हूं।

यह वह जगह है जो मैं का उपयोग किया गया ....

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

वहाँ भी एक आवश्यकता है कि उपयोगकर्ता एक एस्केप वर्ण का उपयोग कर डबल उद्धरण के भीतर एक दोहरे-उद्धरण सम्मिलित कर सकते हैं है? ("कुत्ते ने कहा \" वाह \ "" –

+0

@ एंड्रयू - नहीं। –

+0

शायद होना चाहिए .... –

उत्तर

3

.NET regexes सामान्य से भी अधिक शक्तिशाली हैं और आप निश्चित रूप से जो भी चाहते हैं वह कर सकते हैं। इस पर एक नज़र डालें, जो संतुलित कोष्ठक की तलाश में है, जो अनिवार्य रूप से आपके जैसा ही समस्या है लेकिन ब्रांड्स के साथ और उद्धरण नहीं है।

http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx

2

यह कहना जोखिम भरा है है "नहीं आप कर सकते हैं नहीं" इस मंच पर है, क्योंकि किसी को जाने के लिए और एक काम उपलब्ध कराने के द्वारा बर्बाद होगा जवाब। :-)

लेकिन मैं कहूंगा कि यह वास्तव में नियमित अभिव्यक्तियों को खींच रहा होगा, और आपकी समस्या खूबसूरती से Automata-based programming पर उधार देती है।

व्यक्तिगत रूप से, मैं 20-पंक्ति परिमित राज्य मशीन को बनाए रखने में खुश हूं, फिर 10 वर्ण नियमित अभिव्यक्ति।

input.replaceAll("(?<=\\().*?(?=[\"()])(\"([^\"]*)\")?.*(?=\\))", "$2"); 

यह निम्न परिणाम का उत्पादन:

+0

और voila ... कामकाजी उत्तर है :) – Bohemian

+0

@ बोहेमियन - मुझे दो मायने में सही लगता है 1) किसी ने जवाब दिया 2) मैं अभी भी बीएसए कोड की बीस लाइनों को पसंद करूंगा :-) –

+0

हाँ रेगेक्स केवल लिखने वाला कोड – Bohemian

3

मैं सी बात नहीं करते, लेकिन यहाँ जावा कार्यान्वयन है

"foo (bar \"hello world\" foo) bar" --> "foo (hello world) bar" 
"foo (bar foo) bar" --> "foo() bar" 

यह है कि क्या आप उद्धरण को संरक्षित रखें स्पष्ट नहीं था - यदि आपने किया है, तो $ 2

के बजाय $ 1 का उपयोग करें, अब आपको कामकाजी रेगेक्स मिल गया है, तो आप इसे सी

में आपके लिए काम करने में सक्षम होना चाहिए
+0

यह .NET कार्यान्वयन में काम नहीं करता है। मैंने इसे यहां आजमाया: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

+0

@ एंड्रयू - इसे किसी भी तरह से काम करने का एक तरीका बनना है - निश्चित रूप से भी .NET उद्योग मानक regex हैंडिंग है? – Bohemian

+0

उस भयानक regex के लिए बस एक +1 ... * रोना * – Bohemian

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