2009-01-19 10 views
10

Tôi đang chơi với Boost.Regex để phân tích chuỗi cho các từ và số. Đây là những gì tôi có cho đến thời điểm này:Bạn có thể sử dụng Boost.Regex để phân tích cú pháp luồng không?

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

Có cách nào để yêu cầu regex phân tích cú pháp từ luồng thay vì chuỗi không? Có vẻ như có thể sử dụng bất kỳ trình lặp nào.

+0

Bạn có thể nối các chuỗi chỉ bằng "" a "" b "' không có '+'? Wow Tôi chưa bao giờ thấy điều đó ... đó có phải là tiêu chuẩn không? –

+0

Có, đó luôn là tiêu chuẩn trong C và C++. Bạn có thể nối chuỗi hằng số như thế này, nhưng không phải chuỗi C++ std ::. – Ferruccio

Trả lời

5

Boost.IOStreams có một số regex_filter cho phép một người thực hiện tương đương với regex_replace trên luồng. Tuy nhiên, nhìn vào việc thực hiện, nó có vẻ "gian lận" trong đó nó chỉ đơn giản là tải toàn bộ dòng vào một bộ đệm và sau đó gọi Boost.Regex trên bộ đệm đó.

Thực hiện tìm kiếm regex trên nội dung của luồng mà không phải tải toàn bộ nội dung trong bộ nhớ có thể được thực hiện với hỗ trợ "partial match" của Boost.Regex. Xem ví dụ ở cuối trang.

2

Phương thức khởi tạo regex_iterator yêu cầu BidirectionalIterators, nhưng std :: istream_iterator chỉ là một InputIterator, do đó bạn sẽ không thể thực hiện điều này với bất kỳ lớp và/hoặc các đối tượng dòng tiêu chuẩn nào (cin, ifstream, v.v. .). Nếu bạn có luồng tùy chỉnh đã hiển thị một trình lặp vòng hai chiều, nó sẽ hoạt động.

1

Máy trạng thái hữu hạn cần có khả năng "sao lưu" trong trường hợp những gì nó đang cố gắng không thành công. Điều này là không thể đối với các trình vòng lặp đầu vào, mà không thể "sao lưu" được.