2015-08-27 12 views
7

सी ++ 11 में एम्बेड करने के लिए स्ट्रिंग स्थिरांक से बचने के लिए 6 अलग-अलग नियमित अभिव्यक्ति व्याकरण हैं जिनका आप उपयोग कर सकते हैं। मेरे मामले में, मैं एक घटक के साथ बातचीत कर रहा हूं जो संशोधित ईसीएमएस्क्रिप्ट नियमित अभिव्यक्तियों का उपयोग कर रहा है।एक std :: regex

मुझे नियमित अभिव्यक्ति बनाने की आवश्यकता है "एक्स के साथ शुरू होने वाली स्ट्रिंग से मिलान करें", जहां एक्स एक स्ट्रिंग अक्षर है।

तो नियमित अभिव्यक्ति जो मैं चाहता हूं वह लगभग ^X.* है। स्ट्रिंग एक्स को छोड़कर अधिक नियमित अभिव्यक्ति विशेष वर्ण हो सकते हैं, और मैं उन्हें होना चाहता हूं।

जिसका अर्थ है कि मैं वास्तव में ^ escaped(X) .* चाहता हूं।

अब, मैं ईसीएमएस्क्रिप्ट दस्तावेज़ों पर पढ़ सकता हूं, उन सभी पात्रों को ढूंढ सकता हूं जिनके पास विशेष अर्थ है, एक समारोह लिखें जो उन्हें बचता है, और किया जाता है। लेकिन यह सुरुचिपूर्ण, अक्षम, और त्रुटि प्रवण प्रतीत होता है - विशेष रूप से यदि मैं सभी 6 प्रकार के नियमित अभिव्यक्तियों का समर्थन करना चाहता हूं जो वर्तमान में सी ++ का समर्थन करते हैं, तो भविष्य में अकेले रहने दें।

क्या सी ++ नियमित अभिव्यक्ति में एम्बेड करने के लिए एक शाब्दिक स्ट्रिंग से बचने के लिए मानक में एक सरल तरीका है, संभवतः नियमित अभिव्यक्ति व्याकरण के कार्य के रूप में, या क्या मुझे अपना खुद का रोल करना है?

Here बूस्ट लाइब्रेरी का उपयोग कर एक समान प्रश्न है, जहां भागने की सूची हार्ड-कोडेड है, और फिर नियमित अभिव्यक्ति उत्पन्न होती है जो उन्हें बैकस्लैश करता है। क्या मैं std में उपयोग के लिए उस उत्तर को अनुकूलित करने के लिए कम कर रहा हूं?

+0

[बूस्ट रेगेक्स में उपयोग के लिए स्ट्रिंग से कैसे बचें] में जवाब [http://stackoverflow.com/questions/1252992/how-to-escape-a-string-for-use-in-boost- रेगेक्स) वास्तव में आपको क्या चाहिए। –

+0

आपको इसे से बचने की आवश्यकता क्यों है। यदि एक्स एक स्ट्रिंग है, तो क्या आप अपने रेगेक्स को बस संयोजित करने से नहीं बना सकते, जैसे '"^"+ एक्स +"। * "'। – ClasG

+0

@stribizhev जिसका अर्थ है कि प्रत्येक 6 नियमित अभिव्यक्ति प्रारूपों और साथ में आने वाले किसी भी नए प्रारूप के लिए इसका एक कस्टम संस्करण लिखना है। – Yakk

उत्तर

0

यदि आपको अपना खुद का लिखना है, तो केवल दो प्रकार के बारे में आपको जानना चाहिए।
बीआरई और बाकी।

इन्हें नीचे काम करना चाहिए। इनपुट स्ट्रिंग पर काम करने के लिए ECMAScript टाइप रेगेक्स का उपयोग करें। BRE इनपुट "\\\\$1"

के लिए::


What special characters must be escaped in regular expressions?
जवाब Legacy RegEx Flavors (BRE/ERE)

के तहत दोनों एक ही प्रतिस्थापन का उपयोग करें:

नीचे regexs 'विशेष वर्ण यहां से का उपयोग कर तैयार कर रहे हैं

# "(\\\\[+?(){}|]|[.^$*\\[\\]\\\\-])" 


(       # (1 start) 
     \\ [+?(){}|]    # not sure this is needed (its not needed) 
    | 
     [.^$*\[\]\\-] 
)        # (1 end) 

लिए ERE या ECMAScript इनपुट:

# "([.^$*+?()\\[\\]{}\\\\|-])" 

([.^$*+?()\[\]{}\\|-])  # (1) 

BRE इनपुट उदाहरण:

से पहले -

+_)(*&^%$#@!asdfasfd hello 
+ ? () { } | 
\+ \? \(\) \{ \} \| 
\\+ \\? \\(\\) \\{ \\} \\| 
}{":][';/.,<>? 
here is 

के बाद -

+०१२३५१६४१०
+_)(\*&\^%\$#@!asdfasfd hello 
+ ? () { } | 
\\+ \\? \\(\\) \\{ \\} \\| 
\\\\+ \\\\? \\\\(\\\\) \\\\{ \\\\} \\\\| 
}{":\]\[';/\.,<>? 
here is