2016-11-08 14 views
8

Tôi đang cố gắng khớp một số đoạn dữ liệu nếu dữ liệu thú vị trong luồng dữ liệu.Tại sao không tăng regex '. {2}' match '??'

Cần có một số < hàng đầu sau đó bốn ký tự chữ và số, hai ký tự kiểm tra (hoặc ?? nếu không có dấu hiệu nào được chỉ định) và đường nhỏ >.

Nếu hai ký tự cuối cùng là chữ và số, mã sau hoạt động như mong đợi. Nếu chúng là ?? mặc dù nó không thành công.

// Set up a pre-populated data buffer as an example 
std::string haystack = "Fli<data??>bble"; 

// Set up the regex 
static const boost::regex e("<\\w{4}.{2}>"); 
std::string::const_iterator start, end; 
start = haystack.begin(); 
end = haystack.end(); 
boost::match_flag_type flags = boost::match_default; 

// Try and find something of interest in the buffer 
boost::match_results<std::string::const_iterator> what; 
bool succeeded = regex_search(start, end, what, e, flags); // <-- returns false 

Tôi đã không phát hiện bất cứ điều gì trong the documentation mà gợi ý này nên là trường hợp (tất cả nhưng NULL và newline nên trận đấu AIUI).

Vì vậy, tôi đã bỏ lỡ những gì?

+1

Trình biên dịch nào bạn đang sử dụng? Mine (gcc) đưa ra một cảnh báo rõ ràng nói rằng "trigraph ??> convert to}". – SingerOfTheFall

+0

Tôi đang sử dụng studio hình ảnh 2013 với chuỗi công cụ năm 2008. –

Trả lời

10

??> là một trigraph, nó sẽ được chuyển đổi sang }, mã của bạn là tương đương với:

// Set up a pre-populated data buffer as an example 
std::string haystack = "Fli<data}bble"; 

// Set up the regex 
static const boost::regex e("<\\w{4}.{2}>"); 
std::string::const_iterator start, end; 
start = haystack.begin(); 
end = haystack.end(); 
boost::match_flag_type flags = boost::match_default; 

// Try and find something of interest in the buffer 
boost::match_results<std::string::const_iterator> what; 
bool succeeded = regex_search(start, end, what, e, flags); // <-- returns false 

Bạn có thể thay đổi như sau:

std::string haystack = "Fli<data?" "?>bble"; 

Demo (lưu ý: Tôi sử dụng std::regex ít nhiều giống nhau)

LƯU Ý: trigraph không được dùng nữa từ C++ 11, sẽ (có khả năng) bị xóa khỏi C++ 17

+0

Bạn đã hiểu. Rất thú vị - Tôi không nghe nói về những trigraphs trước đây! –

+0

Họ đã bị xóa (hoặc không được chấp nhận?) Trong các tiêu chuẩn mới nhất – sehe

+1

@không được chấp nhận từ C++ 11, sẽ bị xóa bởi C++ 17 – Danh

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