2011-09-05 34 views
10

Tôi đang cố gắng trích xuất các bản con từ một tệp văn bản bằng cách sử dụng regex tăng cường. Hiện tại tôi chỉ trả lại dòng hợp lệ đầu tiên và dòng đầy đủ thay vì địa chỉ email hợp lệ. Tôi đã thử sử dụng iterator và sử dụng submatches nhưng tôi đã không thành công với nó. Đây là mã hiện tại:Trích xuất các submatch bằng cách sử dụng boost regex trong C++

if(Myfile.is_open()) { 
    boost::regex pattern("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"); 
    while(getline(Myfile, line)) { 
      string::const_iterator start = line.begin(); 
      string::const_iterator end = line.end(); 
      boost::sregex_token_iterator i(start, end, pattern); 
      boost::sregex_token_iterator j; 
      while (i != j) { 
      cout << *i++ << endl; 

    } 
    Myfile.close(); 
} 

Trả lời

16

Sử dụng boost::smatch.

boost::regex pattern("what(ever) ..."); 
boost::smatch result; 
if (boost::regex_search(s, result, pattern)) { 
    string submatch(result[1].first, result[1].second); 
    // Do whatever ... 
} 
+0

Có lẽ Regex của tôi sai nhưng không có kết quả phù hợp với tôi. – John

+0

Là regex, cảm ơn. – John

13
const string pattern = "(abc)(def)"; 
const string target = "abcdef"; 

boost::regex regexPattern(pattern, boost::regex::extended); 
boost::smatch what; 

bool isMatchFound = boost::regex_match(target, what, regexPattern); 
if (isMatchFound) 
{ 
    for (unsigned int i=0; i < what.size(); i++) 
    { 
     cout << "WHAT " << i << " " << what[i] << endl; 
    } 
} 

Kết quả là sau

WHAT 0 abcdef 
WHAT 1 abc 
WHAT 2 def 

Boost sử dụng submatches ngoặc, và submatch đầu tiên luôn là chuỗi xuất hiện đầy đủ. regex_match phải khớp với toàn bộ dòng đầu vào dựa vào mẫu, nếu bạn đang cố gắng so khớp chuỗi con, hãy sử dụng regex_search để thay thế.

Ví dụ tôi đã sử dụng ở trên sử dụng cú pháp regex mở rộng posix, được chỉ định bằng cách sử dụng tham số boost :: regex :: extended. Bỏ qua tham số đó thay đổi cú pháp để sử dụng cú pháp regex kiểu perl. Cú pháp regex khác có sẵn.

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