2009-01-19 28 views
10

मैं Boost.Regex के साथ शब्दों और संख्याओं के लिए तारों का विश्लेषण करने के लिए चारों ओर खेल रहा था।क्या आप स्ट्रीम को पार्स करने के लिए Boost.Regex का उपयोग कर सकते हैं?

#include <iostream> 
#include <string> 
#include <boost/foreach.hpp> 
#include <boost/regex.hpp> 
#include <boost/range.hpp> 

using namespace std; 
using namespace boost; 

int main() 
{ 
    regex re 
    (
     "(" 
      "([a-z]+)|" 
      "(-?[0-9]+(\\.[0-9]+)?)" 
     ")" 
    ); 

    string s = "here is a\t list of Words. and some 1239.32 numbers to 3323 parse."; 
    sregex_iterator m1(s.begin(), s.end(), re), m2; 

    BOOST_FOREACH (const match_results<string::const_iterator>& what, make_iterator_range(m1, m2)) { 
     cout << ":" << what[1].str() << ":" << what.position(1) << ":" << what.length(1) << endl; 
    } 

    return 0; 
} 

वहाँ एक रास्ता एक स्ट्रिंग एक धारा के बजाय से पार्स करने के लिए रेगुलर एक्सप्रेशन से बताने के लिए है: यह क्या मैं अब तक किया है? ऐसा लगता है कि किसी भी इटरेटर का उपयोग करना संभव होना चाहिए।

+0

आप बिना किसी '' '' '' '' '' '' '' के बिना स्ट्रिंग को जोड़ सकते हैं? वाह मैंने कभी नहीं देखा है ... क्या वह मानक है? –

+0

हां, यह हमेशा सी और सी ++ में मानक रहा है। आप इस तरह स्ट्रिंग स्थिरांक को जोड़ सकते हैं, लेकिन सी ++ std :: तार नहीं। – Ferruccio

उत्तर

5

बूस्ट। आईओएसट्रीम के पास regex_filter है जो किसी को स्ट्रीम पर regex_replace के बराबर करने की इजाजत देता है। हालांकि, कार्यान्वयन को देखते हुए, ऐसा लगता है कि यह "धोखा" लगता है कि यह बस पूरी धारा को एक बफर में लोड करता है और उसके बाद उस बफर पर Boost.Regex को कॉल करता है।

स्ट्रीम में पूरी तरह से लोड किए बिना स्ट्रीम की सामग्री पर रेगेक्स खोज बनाना Boost.Regex के "partial match" समर्थन के साथ किया जा सकता है। पेज के अंत में उदाहरण देखें।

2

regex_iterator कन्स्ट्रक्टर को बिडरेक्शनल इटरेटर्स की आवश्यकता होती है, लेकिन std :: istream_iterator केवल एक इनपुट इटरेटर है, इसलिए ऐसा लगता है कि आप इसे मानक स्ट्रीम क्लासेस और/या ऑब्जेक्ट्स (सीन, इस्ट्रीम, इत्यादि) के साथ ऐसा करने में सक्षम नहीं होंगे। ।)। यदि आपके पास एक कस्टम स्ट्रीम है जो बिडरेक्शनल इटरेटर का खुलासा करती है, तो उसे काम करना चाहिए।

1

परिमित राज्य मशीन को अभी भी विफल होने की स्थिति में "बैक अप" करने में सक्षम होना चाहिए। इनपुट इटरेटर्स के लिए यह असंभव है, जो "बैक अप" नहीं कर सकता है।

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

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