Почему не повысить регулярное выражение ‘. {2}’ соответствует ‘??’

Я пытаюсь сопоставить некоторые фрагменты, если интересные данные в потоке данных.

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

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

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

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

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

8

Решение

Так как ??> это триграф, это будет преобразовано в }Ваш код эквивалентен:

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

демонстрация (примечание: я использую std::regex что более или менее то же самое)

НОТА: trigraph устарел с C ++ 11, будет (вероятно) удален с C ++ 17

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]