使用 boost::regex 遍历捕获

Posted

技术标签:

【中文标题】使用 boost::regex 遍历捕获【英文标题】:Iterate through captures with boost::regex 【发布时间】:2015-08-11 21:18:13 【问题描述】:

我有一个正则表达式来使用 boost::regex 捕获 html 标记中的三个字段

"\\/\\/(.1,3?)\\.wikipedia\\.[a-z]+\\/wiki\\/(.*?)\\s*>(.*?)<"

所以,从

<a href=\"//de.wikipedia.org/wiki/Porky%E2%80%99s\" title=\"Porky’s – German\" lang=\"de\" hreflang=\"de\">Deutsch</a>

我明白了

德 Porky%E2%80%99s" title="Porky's – German" lang="de" hreflang="de" 德语

但我想改用 de, Porky%E2%80%99s, Deutsch。

如何让我的正则表达式在找到第一个空格后立即停止匹配第二个字段?

我试过了

"\\/\\/(.1,3?)\\.wikipedia\\.[a-z]+\\/wiki\\/(\\S*?)*>(.*?)<"

所以第二个字段匹配除空格以外的所有内容,但我得到了这个崩溃报告

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >'
  what():  Ran out of stack space trying to match the regular expression.

【问题讨论】:

【参考方案1】:

这可能有效 -

"//(.1,3?)\\.wikipedia\\.[a-z]+/wiki/([^\\s&gt;\"]*).*?&gt;(.*?)&lt;"

我会改用这个 -

"//(.1,3?)\\.wikipedia\\.[a-z]+/wiki/([^\\s&gt;\"]*)[^&gt;]*&gt;(.*?)&lt;"

Formatted:

 //
 ( .1,3? )                   # (1)
 \.
 wikipedia
 \. 
 [a-z]+ 
 /wiki/
 ( [^\s>"]* )                  # (2)
 [^>]* 
 >
 ( .*? )                       # (3)
 <

输出:

 **  Grp 0 -  ( pos 9 , len 98 ) 
//de.wikipedia.org/wiki/Porky%E2%80%99s" title="Porky’s – German" lang="de" hreflang="de">Deutsch<  
 **  Grp 1 -  ( pos 11 , len 2 ) 
de  
 **  Grp 2 -  ( pos 33 , len 15 ) 
Porky%E2%80%99s  
 **  Grp 3 -  ( pos 99 , len 7 ) 
Deutsch  

【讨论】:

以上是关于使用 boost::regex 遍历捕获的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost Regex 不保存捕获

在 C++ 中使用 boost:regex_error 时未定义符号?

使用 boost::regex 更改文件中数据的格式

在 C++Builder 中使用 boost::regex 提取双引号

使用 Boost 的 regex_match 编译 C++ 代码

使用 c++/boost::regex 提取 HTML 文件的特定部分