使用boost::regex迭代捕获
Iterate through captures with boost::regex
我有一个正则表达式来捕获HTML标签中的三个字段,使用boost::regex
"\/\/(.{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,3}?)\.wikipedia\.[a-z]+/wiki/([^\s>"]*).*?>(.*?)<"
我会用这个代替-
"//(.{1,3}?)\.wikipedia\.[a-z]+/wiki/([^\s>"]*)[^>]*>(.*?)<"
格式:
//
( .{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
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用boost::regex迭代捕获
- 如何迭代std::string中所有匹配的正则表达式,使其在c++11 std::regex中的起始位置
- Boost regex token迭代器:在括号之间获取输入