C ++: मुझे किस रेक्सक्स लाइब्रेरी का उपयोग करना चाहिए? [बन्द है]


107

मैं एक वाणिज्यिक (खुला स्रोत नहीं) C ++ प्रोजेक्ट पर काम कर रहा हूं जो एक लिनक्स-आधारित प्रणाली पर चलता है। मुझे C ++ कोड के भीतर कुछ regex करने की आवश्यकता है। (मुझे पता है: मुझे अब 2 समस्याएं हैं।)

प्रश्न: वे कौन से पुस्तकालय हैं, जो नियमित रूप से C / C ++ से रेगेक्स करते हैं, जो मुझे देखने की सलाह देते हैं? एक त्वरित खोज ने मेरा ध्यान आकर्षित किया है:

1) Boost.Regex (मुझे Boost Software लाइसेंस पढ़ने की आवश्यकता है, लेकिन यह सवाल सॉफ़्टवेयर लाइसेंस के बारे में नहीं है)

2) C (C C ++ नहीं) POSIX regex (#include <regex.h>, regcomp, regexec, आदि)

3) http://freshmeat.net/projects/cpp_regex/ (मुझे इस बारे में कुछ नहीं पता है कि यह जीपीएल लगता है, इसलिए इस परियोजना पर प्रयोग करने योग्य नहीं है)


20
यदि कोई भी संकेत के लिए इस पुराने प्रश्न को देख रहा है ... एक नई लाइब्रेरी ने हाल ही में दिखाया है जो उल्लेख के योग्य है: Google की RE2: code.google.com/p/re2
स्टीफन

2
यह नया PCRE2 (PCRE का संशोधित संस्करण) लाइब्रेरी के लिए एक c ++ रैपर है।
जाहिद

जवाबों:


80

Boost.Regex बहुत अच्छा है और C ++ 0x मानक का हिस्सा बनने के लिए स्लेटेड है (यह TR1 में पहले से ही है)।

व्यक्तिगत रूप से, मुझे Boost.Xpressive के साथ काम करने के लिए बहुत अच्छा लगता है । यह एक हेडर-ओनली लाइब्रेरी है और इसमें कुछ अच्छे फीचर्स जैसे स्टैटिक रीजैक्स (संकलन समय पर संकलित रीजैक्स) हैं।

अपडेट: यदि आप C ++ 11 कंपाइलर कंपाइलर का उपयोग कर रहे हैं (gcc 4.8 is not!), Std :: regex का उपयोग करें जब तक कि आपके पास कुछ और उपयोग करने का अच्छा कारण न हो।


4
बूस्ट बग से भरा है और एक कोडिंग मानकों और क्यूए प्रक्रिया का अभाव प्रतीत होता है। यह वास्तव में उत्पादन सॉफ्टवेयर के लिए उपयुक्त नहीं है। इसमें उसका रेगेक्स गियर शामिल है, जो स्थानों में C (C ++ के बजाय) का उपयोग करता है और इसमें स्प्रिंट जैसे असुरक्षित कार्यों के कारण बफर ओवरफ्लो शामिल हैं। जब मैंने एक ऑडिट के बाद बग का एक गुच्छा रिपोर्ट किया, तो वे रिपोर्ट के महीनों बाद "अनजाने" बने रहे। अपने जोखिम पार इस्तेमाल करें।
jww

8
लगभग 5 साल बाद, मैंने आज std :: regex का उपयोग करने की कोशिश की, लेकिन यह पता चला है कि यह जीसीसी में अभी तक लागू नहीं हुआ है। देखें stackoverflow.com/questions/15671536/…
स्टीफन

2
यह अच्छा कारण है कि std का उपयोग नहीं करना :: regex या बढ़ावा देना :: regex इस बात के लिए कि बढ़ावा होगा :: regex, re2 की तुलना में लगभग 10 गुना धीमा है
Arsen Zahray

3
@jww नहीं, C ++ मानक (C ++ 03 TR, C ++ 11 और C ++ 1y) ने कई बूस्ट लाइब्रेरी को मानक में शामिल करने का फैसला किया है । इसका मतलब है, सभी व्यावहारिक उद्देश्यों के लिए, बूस्ट ने मानक बनाया । "शायद" जैसे वैसल शब्दों का उपयोग किए बिना सबूतों के साथ बयान करना और व्यक्तिगत हमलों का उपयोग इस तथ्य को बदलने के लिए कुछ भी नहीं करता है कि अब बूस्ट के बड़े हिस्से सी ++ हैं, और सी ++ की आधुनिक दिशा को परिभाषित करने वाले कई लोग भी बढ़ावा देने पर काम कर रहे हैं।
एलिस

3
@ एलिस - सी और सी ++ समितियां मानक बनाते हैं। वे पुस्तकालयों को शामिल नहीं करते हैं। मुझे उनके बारे में पता नहीं है कि मैं कभी लाइब्रेरी का निर्माण कर रहा हूं।
jww

22

सभी सुझावों के लिए शुक्रिया।

मैंने आज कुछ चीजों की कोशिश की, और जिस सामान के साथ हम करने की कोशिश कर रहे हैं, मैंने सबसे सरल समाधान का विकल्प चुना, जहां मुझे किसी अन्य 3-पार्टी लाइब्रेरी को डाउनलोड करने की आवश्यकता नहीं है। अंत में, मैंने #include <regex.h> और मानक C POSIX कॉल regcomp () और regexec () का उपयोग किया। C ++ नहीं, लेकिन एक चुटकी में यह सबसे आसान साबित हुआ।


19

पिछले सी + + परियोजनाओं में, मैंने पीसीआरई का उपयोग अच्छी सफलता के साथ किया है । कई उच्च प्रोफ़ाइल परियोजनाओं में इसका उपयोग करने के बाद से यह बहुत पूर्ण और अच्छी तरह से परीक्षण किया गया है। और मैं देखता हूं कि हाल ही में Google ने PCRE के लिए C ++ रैपर्स के एक सेट का भी योगदान दिया है।


16

टी 1 के बाद से सी ++ में एक बिलियन रेगेक्स लाइब्रेरी है। AFAIK बूस्ट का रेगेक्स लाइब्रेरी इसके साथ बहुत संगत है और इसे प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है, अगर आपका मानक पुस्तकालय TR1 प्रदान नहीं करता है।


क्या संकलक TR1 है? मेरी प्रतिलिपि g ++ 4.1.2 (डेबियन एच) के पास #include <regex> का समर्थन नहीं है, लेकिन मेरे ध्यान में TR1 लाने के लिए धन्यवाद, मैं भूल गया था। TR1 और C ++ 0x पर अधिक जानने के लिए उत्सुक अन्य लोगों के लिए, en.wikipedia.org/wiki/Technical_Report_1
Stéphane

SP1 Visual Studio 2008 में TRG सहित अधिकांश TR1 हैं। मुझे पता है कि यह लिनक्स पर आपकी मदद नहीं करता है, लेकिन दूसरों की दिलचस्पी हो सकती है। Dinkumware gcc पर TR1 का भी समर्थन करता है।
माइकल बूर

जैसा कि मैंने लिखा है, अगर आपके एसटीडी लाइब्रेरी में रेगेक्स नहीं है, तो आप बूस्ट का उपयोग कर सकते हैं: बूस्ट.ओड
लाइब

3
जी ++ 4.5.0। TR1 tr1 / regex में रहता है। उदाहरण: #include <tr1 / regex>
Ogre Psalm33

11

दो और विकल्प:

यदि आप इसे c ++ 11 में लिख सकते हैं - ट्यूटोरियल करें: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

नोट: केवल c ++ 11 regex लाइब्रेरी को लिखने के समय जो मुझे पता है कि काम करता है वह है क्लैंग / llvm एक , और केवल मैक पर काम करता है। GNU अभी भी रेगेक्स को लागू नहीं करता है । मैं विजुअल स्टूडियो के बारे में नहीं जानता। अधिकांश लोग अभी भी बूस्ट रेगेक्स कार्यान्वयन का उपयोग करते हैं ।


या आप रैगेल का उपयोग कर सकते हैं कि आप के लिए पार्स करने के लिए एक परिमित राज्य मशीन उत्पन्न करें, और C / C ++ कोड कार्यान्वयन उत्पन्न करें: http://www.complang.org/ragel/

मैंने इसे पार्स जोंस को कोड जनरेट करने के लिए थोड़ा इस्तेमाल किया। यह रैगेल फ़ाइल: https://github.com/matiu2/yajp/blob/master/parser/number.rl इस कोड को उत्पन्न करने के लिए प्रयोग किया जाता है https://github.com/matiu2/yajp/blob-master/parser/json .hpp # L254 और यह परिमित राज्य मशीन आरेख:

राज्य आरेख


अपडेट 1:

lvm का libc ++ रेगेक्स ubuntu 14.04 पर काम करता है: libc ++ - dev - LLVM C ++ मानक पुस्तकालय (विकास फाइलें)। जब संकलन:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

अपडेट 2:

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



7

आप फास्ट रेगेक्स लाइब्रेरी को भी देख सकते हैं, जिसे भारी मात्रा में डेटा के खिलाफ हजारों पैटर्न के फास्ट मैच करने के लिए यैंडेक्स सर्च इंजन में विकसित किया गया था ।


6

मैंने व्यक्तिगत रूप से हमेशा boost.regex का उपयोग किया है (हालांकि मुझे C ++ में regex की बहुत आवश्यकता नहीं है)। Microsoft Labs के पास एक regex लाइब्रेरी भी है, जिसे GRETA: http://research.microsoft.com/projects/greta/ कहा जाता है । जाहिरा तौर पर यह बहुत तेज़ है और इसमें संपूर्ण पर्ल 5 सिंटैक्स की सुविधा है। मैंने इसका उपयोग नहीं किया है, लेकिन आप इसका परीक्षण कर सकते हैं।


8
GRETA ( research.microsoft.com/en-us/downloads/… ) को एरिक निबलर द्वारा बनाया गया था जब उन्होंने Microsoft (1998-2001 में GRETA की हेडर फाइलों से) पर काम किया था। एरिक नीब्लर ने फिर 2007 में बूस्ट.एक्सप्रेसिव बनाया। लोगों को Boost.Xpressive का उपयोग करना चाहिए क्योंकि यह नया है और "Microsoft रिसर्च एंड यूजर लाइसेंस एग्रीमेंट" की तुलना में एक अच्छा लाइसेंस है
क्रिश्चियन एडम

1
क्षमा करें, मैं यह नहीं देखता कि बूस्ट लाइब्रेरी में कैसे खींचना एक अच्छी बात है। पिछली बार जब मैंने स्थानीय डाउनलोड को बढ़ावा देने के असम्पीडित संस्करण की जाँच की तो 400 megs है। बूढ़े टेम्पलेट पागलपन का उल्लेख नहीं करने के लिए आपको बढ़ावा मिलता है। क्षमा करें, मैं ग्रेग जवाब देने की सलाह देता हूं।
चाड


@Chad को बढ़ावा देने के लिए एक प्रसिद्ध और अच्छी तरह से मानक पुस्तकालयों का सेट माना जाता है जो कई स्थितियों में सहायक होते हैं? यदि डाउनलोड का आकार आपके लिए बहुत बड़ा है, तो किसी भी चीज़ की ज़रूरत के लिए बीसीडी का उपयोग करें; boost.regex इस तरह से छीन लिए जाने पर काफी छोटा होता है।
एलिस


1

यहाँ किसी ने C ++ 0x के साथ आने वाले के बारे में कुछ नहीं कहा। यदि आप एक संकलक और एसटीएल का उपयोग कर रहे हैं जो C ++ 0x का समर्थन करता है तो आप अपनी परियोजना में एक और काम करने के बजाय इसका उपयोग कर सकते हैं।


1
यदि आप सबसे ज्यादा वोट देने वाले उत्तर (2+ साल पहले से) को देखते हैं, तो इसमें इसका उल्लेख है।
मतीन उल्हाक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.