2015-02-14 9 views
5

का उपयोग कर इन-प्लेस रेगेक्स प्रतिस्थापन मेरे पास 'टेक्स्ट' नामक std :: स्ट्रिंग में संग्रहीत टेक्स्ट का एक बड़ा अनुच्छेद है। इस स्ट्रिंग पर, मैं बूस्ट रेगेक्स लाइब्रेरी का उपयोग करके कुछ पैटर्न को एक सफेद स्थान के साथ बदल रहा हूं। मेरा कोड यहाँ है।बूस्ट

// Remove times of the form (00:33) and (1:33) 
boost::regex rgx("\\([0-9.:]*\\)"); 
text = boost::regex_replace(text, rgx, " "); 

// Remove single word HTML tags 
rgx.set_expression("<[a-zA-Z/]*>"); 
text = boost::regex_replace(text, rgx, " "); 

// Remove comments like [pause], [laugh] 
rgx.set_expression("\\[[a-zA-Z]* *[a-zA-Z]*\\]"); 
text = boost::regex_replace(text, rgx, " "); 

// Remove comments of the form <...> 
rgx.set_expression("<.+?>"); 
text = boost::regex_replace(text, rgx, " "); 

// Remove comments of the form {...} 
rgx.set_expression("\\{.+?\\}"); 
text = boost::regex_replace(text, rgx, " "); 

// Remove comments of the form [...] 
rgx.set_expression("\\[.+?\\]"); 
text = boost::regex_replace(text, rgx, " "); 

मेरी समझ से, हर बार जब मैं regex_replace फ़ंक्शन चलाता हूं, तो यह एक नई स्ट्रिंग बनाता है और आउटपुट लिखता है। यदि मैं regex_replace फ़ंक्शन को एन अलग-अलग पैटर्न के साथ चलाता हूं, तो यह एन नए तारों को आवंटित करेगा (पुराने लोगों को हटा देगा)।

चूंकि स्मृति आवंटन समय लेने वाला है, क्या नई स्ट्रिंग आवंटित किए बिना 'इन-प्लेस' प्रतिस्थापन करने का कोई तरीका है?

उत्तर

2

regex_replace में दो ओवरलोड हैं, जो आप अभी उपयोग कर रहे हैं, और दूसरा जो इटरेटर लेता है। आप आउटपुट इटरेटर को उसी श्रेणी के रूप में निर्दिष्ट कर सकते हैं जिस पर आप काम कर रहे हैं।

boost::regex_replace(text.begin(), text.begin(), text.end(), rgx, 
        " "); 
+0

धन्यवाद, मुझे लगता है कि यह करेगा। –

+2

चेतावनी: जब परिणाम स्वरूपक एक अलग लंबाई स्ट्रिंग के साथ मैच को प्रतिस्थापित करता है तो परिणाम संभवतः अपरिभाषित होता है। (!!!) (प्रलेखन अलियाड/ओवरलैपिंग इनपुट/आउटपुट श्रेणियों के बारे में कुछ भी नहीं कहता है) – sehe

0

अपने regex प्रतिस्थापन की न तो जैसा कि पिछले प्रतिस्थापन कदम के उत्पादन प्रक्रियाओं, तो आप सिर्फ एक बड़ा regex में उन regexes रख सकते हैं और चलने वाले एक कर सकते हैं, एक बार।

आप प्रत्येक रेगेक्स भाग के लिए अलग-अलग प्रतिस्थापन स्ट्रिंग भी निर्दिष्ट कर सकते हैं, लेकिन यह यहां आवश्यक नहीं है।

boost::regex rgx("(\\([0-9.:]*\\))|" 
       "(<[a-zA-Z/]*>)|" 
       "(\\[[a-zA-Z]* *[a-zA-Z]*\\])|" 
       "(<.+?>)|" 
       "(\\{.+?\\})|" 
       "(\\[.+?\\])"); 
text = boost::regex_replace(text, rgx, " ");