0

正規表現を使用してhtmlページのdiv間から文字列を取得していますが、メモリ不足エラーが発生しました。VisualStudio2012とC++を使用しています。

正規表現は"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は正常に動作するので、私のコードだけでなく、いくつかのオンライン正規表現ツールも実行します:(助けてください

4

2 に答える 2

2

.複数回発生する可能性のある場所で aを使用しているため<、前のものを含むすべての に一致し</div>ますが、これはおそらく望ましくないことです。

そして今、必須リンクの正規表現は、 XHTML 自己完結型タグを除く開始タグに一致します

HTML を解析するために regexp を使用することは、一般的に悪い考えです。代わりにHTML パーサーを使用する必要があります

于 2013-02-10T11:32:54.617 に答える
0

今わかりました。正規表現は、一部の領域でかなり制限されています。パーサーを見て、試してみます。その間に私がやったことは次のとおりです。

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、私はそれが良くないことを知っていますが、うまくいきます。

ありがとうクレメントベロット

于 2013-02-11T03:18:46.433 に答える