惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
Google DeepMind News
Google DeepMind News
V
V2EX
The Cloudflare Blog
博客园 - 聂微东
月光博客
月光博客
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
B
Blog
宝玉的分享
宝玉的分享
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
Microsoft Security Blog
Microsoft Security Blog
C
Check Point Blog
博客园_首页
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed

博客园 - shootingstars

硬件相关概念 我的Function C的可变参数 C++概念网摘 Mifare 串行读取协议 韦根协议 学习C的可变参数 关于汇编程序调用各种C函数的例子 如何移植Java的类中的super到C++代码中 编译原理学习 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd 使用python编写每日构建工具 boost::regex学习(5) - shootingstars - 博客园 boost::regex学习(3) boost::regex学习(2) 《世界大战》《变形金刚》观后感 boost::regex学习(1) boost::algorithm学习 五种迭代器
boost::regex学习(4) - shootingstars - 博客园
shootingstar · 2007-08-01 · via 博客园 - shootingstars

六:关于重复的贪婪
我们先来一个例子:

std::string regstr = "(.*)(age)(.*)(\\d{2})";
boost::regex expression(regstr);
std::
string testString = "My age is 28 His age is 27";
boost::smatch what;
std::
string::const_iterator start = testString.begin();
std::
string::const_iterator end = testString.end();
while( boost::regex_search(start, end, what, expression) )
{

    std::

string name(what[1].first, what[1].second);
    std::
string age(what[4].first, what[4].second);
    std::cout
<< "Name:" << name.c_str() << std::endl;
    std::cout
<< "Age:" <<age.c_str() << std::endl;
    start 
= what[0].second;
}

我们希望得到的是打印人名,然后打印年龄。但是效果令我们大失所望:
Name:My age is 28 His
Age:27

嗯,查找原因:这是由于"+"号或者"*"号等重复符号带来的副作用,这些符号会消耗尽可能多的输入,使之是“贪婪”的。即正则表达式(.*)会匹配最长的串,而不是匹配最短的成功串。
如何使得这些重复的符号不再“贪婪”,我们在重复符号后加上"?"即可。

std::string regstr = "(.*?)(age)(.*?)(\\d{2})";
boost::regex expression(regstr);
std::
string testString = "My age is 28 His age is 27";
boost::smatch what;
std::
string::const_iterator start = testString.begin();
std::
string::const_iterator end = testString.end();
while( boost::regex_search(start, end, what, expression) )
{

    std::

string name(what[1].first, what[1].second);
    std::
string age(what[4].first, what[4].second);
    std::cout
<< "Name:" << name.c_str() << std::endl;
    std::cout
<< "Age:" <<age.c_str() << std::endl;
    start 
= what[0].second;
}

打印输出:
Name:My
Age:28
Name: His
Age:27