2016-02-11 4 views
2

Я читаю HTML-страницу и пытаюсь найти в ней определенную строку.Невозможно получить результаты соответствия регулярному выражению - MFC/C++

У меня есть следующий код:

std::string str = test.GetString(); // someString (the string i have checked it, it's basically an html page) 
    std::smatch match; 
    std::regex re("0x(\\d|[A-Z]).*0000"); // the pattern I'm searching for 
    if (std::regex_search(str, match, re)){ 
     test = "found"; // found gets printed 
    } 
    TRACE("%s\n",match[0]); // this outputs some garbage like this '˜ò' 

Я хочу напечатать/магазин результат матча нашел, но я получаю некоторый мусор вместо этого.

Отказ от ответственности: Я новичок в регулярном выражении C++. Я мог бы сделать базовую ошибку

+0

Для образца кода, как это, просто поместите строку в коде вместо вызова ' test.GetString() '. Таким образом, выясняется, что происходит. –

+0

Я не могу поместить весь html ... Это tooo long – Rana

+0

Хорошо, но попробуйте поставить более короткую строку, которая показывает проблему. –

ответ

3
std::smatch match; 
... 
TRACE("%s\n",match[0]); // this outputs some garbage like this '˜ò' 

%s спецификатор типа в TRACE макро ожидает указатель на строку с сырой C (char* в ANSI/MBCS строит, wchar_t* в Unicode строит - Я предполагаю, что вы делаете ANSI/MBCS здесь.).

Но match[0]не необработанный указатель строки С.

Так у вас есть несоответствие между тем, что вы обещали TRACE через %s (т.е. сырой C строка char* указатель), и то, что вы на самом деле переходя к ней (т.е. match[0]).

Согласно some online documentation, std::smatch является конкретизацией std::match_results шаблона, в частности:

smatch --> match_results<string::const_iterator> 

smatch::operator[] (который вы ссылаетесь в вашем коде, как match[0]) returns a reference to another object, который является std::sub_match. Этот std::sub_match class представляет пару итераторов, обозначающих последовательности совпадающих символов.

Итак, вы обещают к TRACE передать строковый указатель сырым C (через %s спецификатор типа), но на самом деле вы пропусканием совершенно разные вещи, то есть ссылки на std::sub_match объекта (через ваш match[0]): неудивительно, что напечатанный текст не имеет смысла.

Что вам нужно сделать, так это получить указатель строки C из выражения match[0].

Для этого вы можете вызвать std::sub_match's str() method.Это возвращает объект std::string.

Однако этот std::string объект не именно то, что %s ожидает, что: на самом деле, %s представляет собой сырой указатель С строку (например, const char*), неstd::string экземпляра.

Итак, последний шаг - извлечь этот необработанный указатель строки C из объекта std::string, и это делается путем вызова std::string::c_str() method.

Суммируя эти логические шаги:

std::smatch match; 
... 
match[0]    --> reference to std::sub_match object 
match[0].str()   --> std::string object 
match[0].str().c_str() --> raw C string pointer (const char*) 

Итак, ваше TRACE утверждение можно записать в виде:

TRACE("%s\n", match[0].str().c_str()); 
+0

Вау, это прекрасный ответ! Я понимаю это полностью сейчас, и я хочу обнять тебя! Спасибо вам большое за это! – Rana

+0

@ Рана: Тебе очень рады. Рад, что это помогло. –

+0

Просто интересно, могу ли я сказать 'TRACE' ожидать' std :: string'? вместо '% s' – Rana

2

Проблема заключается в том, что match[0] возвращает объект типа sub_match, который представляет собой просто пару итераторов. Если первый аргумент TRACE макроса является C-стиль спецификатор формата, преобразовать sub_match объект в строку C следующим образом:

TRACE("%s\n", std::string(match[0]).c_str()); 

То есть, использовать sub_match «s operator string(), чтобы получить (временный) C++ строка объект, затем вызовите его функцию-член c_str(), чтобы получить (временный) объект строки C.

+0

Отлично !, он работает! СПАСИБО! – Rana

+0

Даже если это работает, я не уверен, что происходит. мог бы объяснить немного больше? – Rana

+0

Я проверил значение 'match [0]' в отладчике и имеет значение '157'. Что это означает, номер идентификатора объекта? – Rana

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

  • Нет связанных вопросов^_^