2013-02-10 142 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); 

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

感谢克莱门特贝洛特