2009-01-19 26 views
10

Kelimeler ve sayılar için dizeleri ayrıştırmak için Boost.Regex ile oynuyordum.Bir akışı ayrıştırmak için Boost.Regex'i kullanabilir miyim?

#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; 
} 

bir akış yerine bir dizesinden ayrıştırmak için regex anlamanın bir yolu var mı: Bu defa ne var? Herhangi bir yineleyicinin kullanılması mümkün gibi görünüyor.

+0

Dizeleri sadece "a" "b" '+' olmadan ayırabilirsiniz. Vay görmedim ki ... bu standart mı? –

+0

Evet, bu her zaman C ve C++ standartlarında olmuştur. Dize sabitlerini bu şekilde birleştirebilirsiniz, ancak C++ std :: dizeleriyle değil. – Ferruccio

cevap

5

Boost.IOStreams, bir akışta bir regex_replace eşdeğerini gerçekleştirmek için bir regex_filter sahiptir. Ancak, uygulamaya baktığımızda, tüm akışı bir arabelleğe yüklediğinden ve bu tamponda Boost.Regex'i çağırdığından "aldatma" gibi görünüyor.

Bir belleğin içeriğini tamamen belleğe yüklemeye gerek kalmadan içeriğin üzerinde düzenli olarak arama yapmak, Boost.Regex desteğiyle "partial match" desteği ile yapılabilir. Sayfanın sonundaki örneğe bakın.

2

Regex_iterator yapıcısı BidirectionalIterators gerektirir, ancak std :: istream_iterator yalnızca bir InputIterator'dır, bu nedenle standart akış sınıfları ve/veya nesneleri (cin, ifstream, vb.) Herhangi biriyle bunu yapamazsınız. .). İki yönlü bir yineleyiciyi açıklayan özel bir akışınız varsa, çalışmalıdır.

1

Sonlu durum makinesinin, şu anda denediği şeyin başarısız olması durumunda "yedeklenmesi" gerekir. Bu, "yedeklenemeyen" giriş yineleyicileri için mümkün değildir.

İlgili konular