![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Partial MatchesBoost , Boost.Regex 5.1.2 , Boost.Regex 5.1.2
|
Результат |
M[0]. Сопоставимый |
M[0]. первый |
M[0]. вторая |
|
---|---|---|---|---|
Без матча |
Ложь |
Неопределенный |
Неопределенный |
Неопределенный |
Частичный матч |
Правда |
Ложь |
Начало частичного матча. |
Конец частичного матча (конец текста). |
Полный матч |
Правда |
Правда |
Начало полного матча. |
Конец полного матча. |
Имейте в виду, что использование частичных матчей иногда может привести к несовершенному поведению:
Ниже приведен пример тестов, чтобы увидеть, может ли текст быть действительным номером кредитной карты, поскольку пользователь нажимает на ключ, введенный символ будет добавлен к строке, которая строится, и передан is_possible_card_ number
. Если это вернет, то текст может быть действительным номером карты, поэтому кнопка OK пользовательского интерфейса будет включена. Если он возвращает ложный, то это еще не действительный номер карты, но может быть с большим вводом, поэтому пользовательский интерфейс отключит кнопку OK. Наконец, если процедура бросает исключение, вход никогда не может стать действительным номером, и введенный символ должен быть отброшен, и соответствующий признак ошибки отображается пользователю.
#include <string> #include <iostream> #include <boost/regex.hpp> boost::regex e("(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})"); bool is_possible_card_number(const std::string& input) { // // return false for partial match, true for full match, or throw for // impossible match based on what we have so far... boost::match_results<std::string::const_iterator> what; if(0 == boost::regex_match(input, what, e, boost::match_default | boost::match_partial)) { // the input so far could not possibly be valid so reject it: throw std::runtime_error( "Invalid data entered - this could not possibly be a valid card number"); } // OK so far so good, but have we finished? if(what[0].matched) { // excellent, we have a result: return true; } // what we have so far is only a partial match... return false; }
В следующем примере текстовый ввод взят из потока, содержащего неизвестное количество текста; этот пример просто учитывает количество тегов HTML, встречающихся в потоке. Текст загружается в буфер и ищет часть за один раз, если был обнаружен частичный матч, то частичный матч проверяется во второй раз как начало следующей партии текста:
#include <iostream> #include <fstream> #include <sstream> #include <string> #include <boost/regex.hpp> // match some kind of html tag: boost::regex e("<[^>]*>"); // count how many: unsigned int tags = 0; void search(std::istream& is) { // buffer we'll be searching in: char buf[4096]; // saved position of end of partial match: const char* next_pos = buf + sizeof(buf); // flag to indicate whether there is more input to come: bool have_more = true; while(have_more) { // how much do we copy forward from last try: unsigned leftover = (buf + sizeof(buf)) - next_pos; // and how much is left to fill: unsigned size = next_pos - buf; // copy forward whatever we have left: std::memmove(buf, next_pos, leftover); // fill the rest from the stream: is.read(buf + leftover, size); unsigned read = is.gcount(); // check to see if we've run out of text: have_more = read == size; // reset next_pos: next_pos = buf + sizeof(buf); // and then iterate: boost::cregex_iterator a( buf, buf + read + leftover, e, boost::match_default | boost::match_partial); boost::cregex_iterator b; while(a != b) { if((*a)[0].matched == false) { // Partial match, save position and break: next_pos = (*a)[0].first; break; } else { // full match: ++tags; } // move to next match: ++a; } } }
Статья Partial Matches раздела Boost.Regex 5.1.2 Boost.Regex 5.1.2 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Boost.Regex 5.1.2 ::
реклама |