2011-05-12 15 views
12

मैं सी ++ में कुछ नियमित अभिव्यक्ति करना चाहता था इसलिए मैंने इंटरवेब्ज़ पर देखा (हाँ, मैं सी ++ के साथ शुरुआती/मध्यवर्ती हूं) और this SO answer मिला।regex: boost :: xpressive vs boost :: regex

मुझे वास्तव में नहीं पता कि boost :: regex और boost :: xpressive के बीच क्या चयन करना है। पेशेवर/विपक्ष क्या हैं?

मैंने यह भी पढ़ा कि बूस्ट :: xpressive को बढ़ावा देने का विरोध :: regex एक हेडर-केवल लाइब्रेरी है। लिनक्स और विंडोज़ पर स्थिर रूप से संकलित :: रेगेक्स को संकलित करना मुश्किल है (मैं लगभग हमेशा क्रॉस-प्लेटफ़ॉर्म अनुप्रयोग लिखता हूं)?

मुझे संकलन समय की तुलना में भी रूचि है। मेरे पास boost :: xpressive का उपयोग करके एक वर्तमान कार्यान्वयन है और मैं संकलन समय के साथ बहुत संतुष्ट नहीं हूं (लेकिन मुझे :: regex को बढ़ावा देने के लिए कोई तुलना नहीं है)।

बेशक मैं regex कार्यान्वयन के लिए अन्य सुझावों के लिए भी खुला हूं। आवश्यकताएं निःशुल्क हैं (बीयर में) और http://nclabs.org/license.php के साथ संगत।

उत्तर

4

ठीक है अगर आपको रनटाइम पर नियमित अभिव्यक्ति बनाने की आवश्यकता है (यानी उपयोगकर्ता को नियमित रूप से अभिव्यक्ति में टाइप करने के लिए टाइप करना) आप xpressive का उपयोग नहीं कर सकते क्योंकि यह केवल संकलित समय है।

दूसरी ओर, चूंकि यह संकलन-समय का निर्माण है, इसलिए इसे regex से आपके अनुकूलक से अधिक लाभ होना चाहिए।

मैं Boost.MPL, StateChart, और Spirit के साथ पर्याप्त सामान करता हूं कि 220KB संकलक चेतावनी और त्रुटियां वास्तव में मुझे बहुत परेशान नहीं करती हैं। अगर यह आपको नरक की तरह लगता है, तो बूस्ट के साथ चिपकें। रेगेक्स।

यदि आप xpressive का उपयोग करते हैं, तो मैं अत्यधिक -Wfatal-errors पर मोड़ने की सलाह देता हूं क्योंकि यह पहली 'त्रुटि:' पंक्ति के बाद संकलन (और आगे त्रुटियों) को रोक देगा।

संकलन समय के लिए, यह कोई प्रतियोगिता नहीं है। बूस्ट। रेगेक्स तेज होगा *। तथ्य यह है कि एक्सप्रेशिव एमपीएल का उपयोग करता है संकलन के समय नाटकीय रूप से बढ़ने का कारण बनता है।

* यह मान लिया गया है कि आप केवल dll निर्माण/इसलिए एक बार

+10

यह पूरी तरह से सच नहीं है। Xpressive रनटाइम regexes का भी समर्थन करता है, यहां देखें: http://www.boost.org/doc/libs/1_46_1/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes – Pablo

+1

@ पाब्लो धन्यवाद! मैंने कभी नहीं महसूस किया कि यह ऐसा किया। क्या आप जानते हैं कि इसका बैकएंड क्या उपयोग करता है? क्या यह एक precompiled lib की आवश्यकता है? – KitsuneYMG

+2

इसका एक शीर्षलेख केवल lib है। इंस्टॉलेशन नोट्स देखें: http://www.boost.org/doc/libs/1_46_1/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive मुझे संकलन के समय में समस्या नहीं है। कारण मैं बूस्ट में बदल गया। रेगेक्स आईसीयू समर्थन था। – Pablo

2

बूस्ट पुस्तकालयों का उपयोग करते समय मैं क्रॉस प्लेटफार्म संगतता के मुद्दों के कारण हेडर केवल पुस्तकालयों के उपयोग की ओर झुकता हूं। इसका निचला पक्ष यह है कि जब आपका कंपाइलर लाइब्रेरी के आपके उपयोग से संबंधित त्रुटि की रिपोर्ट करता है, तो हेडर केवल आउटपुट आर्केन की तरफ जाता है।

+0

लाइब्रेरी जो शीर्षलेख हैं केवल आमतौर पर बहुत सारे टेम्पलेट कोड होते हैं, और टेम्पलेट त्रुटियां बहुत आर्केन हो सकती हैं जैसे आप इसे डालते हैं। –

+1

"शीर्षलेख-केवल पुस्तकालयों में क्रॉस-प्लेटफ़ॉर्म समस्याएं भी हो सकती हैं।" - एमक्यूआर –

+1

हालांकि, हेडर केवल पुस्तकालय एक नई बिल्ड सिस्टम पर निर्भरता एकत्रित करना बहुत आसान बनाते हैं। – dhardy

2

मान लीजिए कि आप एक उचित हालिया कंपाइलर का उपयोग कर रहे हैं, वहां एक सुंदर सभ्य मौका है कि इसमें पहले से ही एक रेगेक्स पैकेज शामिल है। बस #include <regex> करने का प्रयास करें और देखें कि संकलक इसे पाता है या नहीं।

चीजों की एकमात्र चाल यह है कि यह दो अलग-अलग नामस्थानों में से (या दोनों) में हो सकती है। रेगेक्स को सी ++ मानक के टीआर 1 में शामिल किया गया था, और इसमें सी ++ 11 के अंतिम ड्राफ्ट भी शामिल हैं। टीआर 1 संस्करण tr1 नामक नामस्थान में है, जहां मानक संस्करण std में है, बस बाकी लाइब्रेरी की तरह।

एफडब्ल्यूआईडब्ल्यू, यह अनिवार्य रूप से बूस्ट रेगेक्स जैसा ही है, बूस्ट एक्सप्रेसिव नहीं है।

+0

मैं सी ++ 0x का उपयोग नहीं करना पसंद करूंगा। मैं boost :: regex और boost :: xpressive के बीच अंतर का वर्णन करने वाले उत्तर की तलाश में हूं। – orlp

4

एक काफी महत्वपूर्ण अंतर यह है कि बूस्ट है Regex यूनिकोड समर्थन के लिए आईसीयू को जोड़ने (चरित्र वर्गों, आदि) Boost Regex ICU Support समर्थन कर सकते हैं।

जहां तक ​​मैं कह सकता हूं, बूस्ट एक्सप्रेसिव में इस प्रकार का समर्थन अंतर्निहित नहीं है।

2

मैं अधिक सैद्धांतिक तरीके से संकलन-समय नियमित अभिव्यक्तियों (सीटीआर) बनाम रन-टाइम (गतिशील) नियमित अभिव्यक्तियों (आरटीआर) के विषय में गहराई से अन्य लोगों के उत्तरों को पूरक करने का प्रयास करूंगा (यह विषय ओपी द्वारा निहित है अप्रत्यक्ष रूप से प्रश्न IMHO)। रन-टाइम रेगेक्स अधिक ज्ञात और लोकप्रिय (अधिकांश भाषा कोर-लाइब्रेरी कार्यान्वयन) हैं, मुझे लगता है कि ऐतिहासिक कारणों से। वे ठीक हैं जब नियमित अभिव्यक्ति को सीटीआर के विपरीत रन-टाइम पर निर्धारित किया जाता है। परिमित राज्य मशीन के आधार पर दोनों काम करते हैं।

आरटीआर "संकलित" और किसी प्रकार की सार्वभौमिक परिमित राज्य मशीन द्वारा व्याख्या की जाती है (सार्वभौमिक अर्थ यह है कि इस प्रकार का दुभाषिया जो योजना रन-टाइम पर दिया जाता है, कुछ आंतरिक डेटा संरचना में "संकलित" होता है - जब आप रेगेक्स स्ट्रिंग पास करते हैं, फिर रन-टाइम पर व्याख्या की गई)।

लेकिन सीटीआर संकलन समय पर विशेष regex के लिए विशिष्ट "संकलित" जाता है और कर रहे हैं, तो आप उन्हें उपयोग नहीं कर सकते जब regex रन-टाइम में (पाठ संपादक, फ़ाइल/इंटरनेट खोज इंजन जैसे अनुप्रयोगों दिया जाता है)।

लेकिन वे पहले से अधिक कुशल (सैद्धांतिक रूप से) हैं क्योंकि संकलन-समय परिमित राज्य मशीन में अनुकूलित किया गया है, इस मशीन की टेबल-प्रीसेट योजना के साथ दुभाषिया की तुलना में कुशल होगा (कुछ समान मामले प्रतिबिंब क्षेत्र पहुंच बनाम संकलन-समय हैं एक्सेस, या विशिष्ट फ़ंक्शन पैरामीटर के लिए ऑप्टिमाइज़ किया गया है जैसा कि there इंगित किया गया है)। एक और फायदा संकलन-समय वाक्यविन्यास जांच है। मेटा प्रोग्रामिंग और/या कोड पीढ़ी के माध्यम से सीटीआर लागू किया जा सकता है।

विशिष्ट कार्यान्वयन के लिए - कई आरटीआर हैं, लेकिन इतने सारे सीटीआर नहीं हैं। सी ++ के लिए वे ऊपर उल्लिखित बूस्ट और एसटीएल सी ++ 0x11 कार्यान्वयन हैं। आपको रेगेक्स परफॉर्मेंस/जेनरेट कोड/मेमोरी उपयोग के आकार को अनुकूलित करने के लिए उनकी आवश्यकता हो सकती है, जो ज्यादातर एम्बेडेड सिस्टम या उच्च परफॉर्मेंस विशिष्ट अनुप्रयोगों के लिए प्रासंगिक होती हैं। SO question about CTR सीटीआर-कार्यान्वयन ढूँढना कठिन है, एक उदाहरण यदि रीक 2 कोड जनरेटर प्रोजेक्ट, Java CTR implementation और सी # कार्यान्वयन है जिसमें रेगेक्स के रन-टाइम संकलन (आईएल कोड में, आंतरिक डेटा संरचना नहीं है) [इसमें इसके बारे में बहुत सवाल है]

पीएस क्षमा करें, प्रतिष्ठा के कारण कुछ प्रासंगिक लिंक पोस्ट नहीं कर पाएंगे