2013-02-10 2 views
0

Я использую регулярное выражение для извлечения строки из divs на html-странице, однако я столкнулся с ошибкой вне памяти. Я использую Visual Studio 2012 и C++.C++ RegEx out of memory

Выражение регулярного выражения "class=\"ListingDescription\">((.*|\r|\n)*?(?=</div>))" и regxbuddy считает, что он делает это в 242 шагах (намного лучше, чем ~ 5000 изначально). На сайте я пытаюсь отказаться информацию от является http://www.trademe.co.nz/Browse/Listing.aspx?id=557211466

Вот код:

typedef match_results<const char*> cmatch; 
tr1::cmatch results; 
try { 
    tr1::regex regx("class=\"ListingDescription\">((.*|\\r|\\n)*?(?=</div>))"); 

    tr1::regex_search(data.c_str(), results, regx); 

     cout << result[1]; 

} 
catch (const std::regex_error& e) { 
    std::cout << "regex_error caught: " << e.what() << '\n'; 
    if (e.code() == std::regex_constants::error_brack) { 
     std::cout << "The code was error_brack\n"; 
     } 
} 

Это ошибка, я получаю:

regex_error caught: regex_error(error_stack): There was insufficient memory to d 
etermine whether the regular expression could match the specified character sequ 
ence. 

RegexBuddy отлично работает и поэтому сходить в Интернете инструменты regex просто не мой код :(Пожалуйста, помогите

+0

Если вы используете VS2012 почему бы не использовать регулярные '' вместо '' Rapptz

+0

Вероятно, не полезно к вашей проблеме, но '(* |. \\ г | \\ n) 'любой, отличный от'. * '? – mah

+0

@mah Да, '.' соответствует всем символам, кроме символов новой строки. –

ответ

2

Вы используете . в месте, где это может произойти несколько раз, поэтому оно будет соответствовать всем <, в том числе до </div>, чего вы, вероятно, не хотите.

И теперь обязательная ссылка RegEx match open tags except XHTML self-contained tags.

Использование regexp для разбора HTML-кода обычно Плохая идея. Вы должны использовать HTML parser вместо

+0

Теперь я вижу. Regex довольно ограничен в некоторых областях. Я посмотрю на парсеры и попробую их. То, что я делал в среднем времени: ' std :: string startstr = "

"; \t \t unsigned startpos = data.find(startstr) + strlen(startstr.c_str()); \t \t unsigned endpos = data.find("
", startpos); \t \t std :: string desc = data.substr (startpos, endpos - startpos); ' – user2058629

0

Я вижу сейчас. Regex довольно ограничен в некоторых областях. Я посмотрю на парсеры и попробую их. То, что я сделал за последнее время, составляет:

std::string startstr = "<div id=\"ListingDescription_ListingDescription\" class=\"ListingDescription\">"; 
unsigned startpos = data.find(startstr) + strlen(startstr.c_str()); 
unsigned endpos = data.find("</div>", 
startpos); 
std::string desc = data.substr (startpos,endpos - startpos); 

LOL, я знаю, что это не очень хорошо, но он работает.

Благодаря Климент Беллот