2013-02-10 60 views
0

我使用正則表達式從html頁面中的divs之間檢索字符串,但是我遇到了內存不足錯誤。我正在使用Visual Studio 2012和C++。C++ RegEx內存不足

正則表達式是"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正常工作等做一些在線正則表達式工具只是不是我的代碼:(請幫助

+0

如果您使用VS2012爲什麼不使用'的'經常代替''可能 – Rapptz 2013-02-10 11:29:26

+0

對沒有你的問題是有用的,但是'(* | \\ [R | \\ n)'與'。*'有什麼不同? – mah 2013-02-10 11:48:34

+0

@mah是的,'.'匹配除換行符之外的所有字符。 – 2013-02-10 12:01:29

回答

2

您正在使用.在它可以發生多次,所以它將匹配所有<,包括</div>之前的那個,這是你可能不想要的。

現在強制鏈接RegEx match open tags except XHTML self-contained tags

使用正則表達式來解析HTML是一般一個壞主意。你應該使用HTML parser而不是

+0

我現在看到了。正則表達式在一些地區相當有限。我會看看解析器並嘗試一下。我所做的同時是: ' 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 2013-02-11 03:15:45

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); 

大聲笑,我知道它不是很好,但它的作品。

感謝克萊門特貝洛特