2009-01-19 5 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

문자열을''a ""b "'단지'+'없이 연결할 수 있습니까? 와우, 나는 그 표준을 본 적이 없다. –

+0

예, C 및 C++에서는 항상 표준이었습니다. 이런 식의 문자열 상수는 연결할 수 있지만 C++ std :: strings는 연결할 수 없습니다. – Ferruccio

답변

5

Boost.IOStreams에는 regex_filter이있어 스트림에서 regex_replace와 동등한 작업을 수행 할 수 있습니다. 그러나 구현을 살펴보면 전체 스트림을 버퍼에로드 한 다음 해당 버퍼에서 Boost.Regex를 호출한다는 점에서 "속임수"처럼 보입니다.

Boost.Regex의 "partial match"지원을 사용하여 스트림의 내용을 메모리에 완전히로드하지 않고도 정규식 검색을 수행 할 수 있습니다. 페이지 끝 부분의 예를보십시오.

2

regex_iterator 생성자에는 BidirectionalIterators가 필요하지만 std :: istream_iterator는 InputIterator 일 뿐이므로 표준 스트림 클래스 및/또는 객체 (cin, ifstream 등)에서는이 작업을 수행 할 수없는 것으로 보입니다.). 양방향 반복기가 노출 된 사용자 정의 스트림이 있으면 작동해야합니다.

1

현재 상태가 실패 할 경우 유한 상태 기계가 "백업"할 수 있어야합니다. 입력 반복자는 "백업"할 수 없습니다.

관련 문제