2016-11-08 2 views
8

Я пытаюсь сопоставить некоторые куски, если интересные данные в потоке данных.Почему не увеличивает регулярное выражение '. {2}' match '??'

Должно быть ведущее <, а затем четыре алфавитно-цифровых символа, два символа контрольной суммы (или ??, если не указано ни одного shecksum), и завершающий >.

Если последние два символа являются буквенно-цифровыми, следующий код работает, как ожидалось. Если они ??, хотя это не удается.

// 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 

Я ничего the documentation, который предполагает, что это должно быть так, не заметил (все, кроме NULL и символ новой строки должен быть матч AIUI).

Так что я пропустил?

+1

Какой компилятор вы используете? Mine (gcc) дает явное предупреждение о том, что «trigraph ??> convert to}». – SingerOfTheFall

+0

Я использую визуальную студию 2013 с цепочкой инструментов 2008 года. –

ответ

10

Поскольку ??> является trigraph, он будет преобразован в }, Ваш код эквивалентен:

// 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 

Вы можете изменить это:

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

Demo (примечание: Я использую std::regex который является более или менее одинаковым)

ПРИМЕЧАНИЕ: Триграмма устарела от C++ 11, будет (вероятно) удалена из C++ 17

+0

Вы поняли. Очень интересно - я раньше не слышал о триграфах! –

+0

Они удалены (или устарели?) По последним стандартам – sehe

+1

@sehe, устаревшие из C++ 11, будут удалены C++ 17 – Danh

Смежные вопросы