2010-06-26 38 views
13

Nếu tôi có mẫu regex đơn giản như "ab". và tôi có một chuỗi có nhiều kết quả khớp như "abc abd". Nếu tôi làm như sau ...Boost C++ regex - cách nhận nhiều kết quả phù hợp

boost::match_flag_type flags = boost::match_default; 
boost::cmatch mcMatch; 
boost::regex_search("abc abd", mcMatch, "ab.", flags) 

Sau đó, mcMatch chỉ chứa kết quả "abc" đầu tiên. Làm thế nào tôi có thể nhận được tất cả các trận đấu có thể?

Trả lời

25

Bạn có thể sử dụng boost::sregex_token_iterator như trong ví dụ ngắn này:

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

int main() { 
    std::string text("abc abd"); 
    boost::regex regex("ab."); 

    boost::sregex_token_iterator iter(text.begin(), text.end(), regex, 0); 
    boost::sregex_token_iterator end; 

    for(; iter != end; ++iter) { 
     std::cout<<*iter<<'\n'; 
    } 

    return 0; 
} 

Kết quả của chương trình này là:

abc 
abd 
+0

Cảm ơn bạn đã trả lời nhanh chóng. Câu hỏi, những gì * lặp lại, nó không xuất hiện được một tăng :: cmatch trong thử nghiệm nhanh chóng của tôi? Tôi vừa đưa ra một ví dụ rất đơn giản. Trong regex của tôi tôi có thể có các nhóm, vì vậy tôi cần truy cập vào thông tin nhóm cho mỗi trận đấu (như là có sẵn từ cmatch)? – Ron

+0

Bạn có thể thử regex_iterator thay vào đó, nó trả về một match_result khi dereferenced, và nên cung cấp cho bạn những gì bạn đang tìm kiếm? – Jacob

Các vấn đề liên quan