首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

初探Boost.Xpressive正则表达式库

正则表达式在字符串操作中有这很重要的地位,可以高效的完成字符串的匹配、查找、替换等操作。Boost.Xpressive是一个正则表达式模板库。在学习Boost.Xpressive之前需要对正则表达式的匹配规则有一定的了解。这里选择Boost.Xpressive而不选择Boost.Regex是因为Boost.Xpressive的功能更强大。Boost.Xpressive由dynamic regexes和static regexes两个库。其中dynamic regexes的功能与Boost.Regex一致。这里主要涉及dynamic regexes。

正则表达式

正则表达式元字符

1、基础

\:转义字符

^:匹配字符串的开始位置

$:匹配字符串的结束位置

.:匹配'\n'之外的单个字符

2、贪婪(重复)

+:一次或多次

?:零次或一次

*:零次或多次

:出现n次

:至少出现n次

:至少出现n次,最多出现m次

+、?、*、、、等后面加?表示惰性算法

贪婪:最大化匹配

惰性:最小化匹配

3、分组与捕获

(pattern):匹配pattern并获取

(?:pattern):匹配pattern但不获取

(?Ppattern):分组命名捕获

4、零宽断言

(?=pattern):正向肯定预查

(?!pattern):正向否定预查

(?

(?

5、分支

|:或

6、范围

[xyz]:字符集合。匹配所包含的任意一个字符

[^xyz]:负值字符集合。匹配未包含的任意一个字符

[a-z]:字符范围。匹配字符范围内的任意字符

[^a-z]:负值字符范围。不匹配字符范围内的任意字符

7、常用转义

\b:匹配一个单词的边界

\B:匹配非单词边界

\d:匹配一个数字字符[0-9]

\D:匹配一个非数字字符[^0-9]

\s:匹配任意空白字符[\f\n\r\t\v]

\S:匹配任意非空白字符[^\f\n\r\t\v]

\w:匹配任何单词字符,包括下划线[A-Za-z0-9]

\W:匹配任何非单词字符,[^A-Za-z0-9]

创建Regex对象

创建dynamic regex有两种途径:1、regex_compiler类模板2、basic_regex::compile()函数。basic_regex: compile()是根据regex_compiler来实现的。

//使用regex_compiler类模板构建Regex对象

sregex_compilercompiler;

sregexregex=compiler.compile("this|that",regex_constants::icase);

//使用basic_regex::compile()函数函数构建Regex对象

sregexregex=sregex::compile("this|that",regex_constants::icase);

匹配

regex_match()算法检查regex是否匹配输入的字符串。regex_match()只有在regex从头到尾匹配整个输入字符串时才会返回true。如果regex只匹配输入字符串的一部分,则regex_match()将返回false。在所有情况下,用于遍历输入序列的迭代器类型必须与用于声明regex对象的迭代器类型匹配。regex_match()算法可选择性地接受match_results struct作为out参数。如果给定,regex_match()算法将在match_results结构中填充关于regex的哪些部分匹配输入的哪些部分的信息。

/**

*邮箱匹配测试

**/

#include

#include

#include

#include

intmain(intargc,char*argv[]){

usingnamespaceboost::xpressive;

std::stringemail="zhao_yong_ming@126.com";

smatchwhat;

sregexregex=sregex::compile("(\\w+)@(\\w+).(\\w+)",regex_constants::icase);

if(regex_match(email,what,regex)) {

for(size_ti=;i

std::cout

}

}

system("pause");

return;

}

==================================================================================================

程序运行结果:

zhao_yong_ming@126.com

zhao_yong_ming

126

com

查找

当您想知道输入序列中是否包含regex匹配的子序列时,使用regex_search()。regex_search()将尝试在输入序列的开头匹配regex,并在序列中后扫描,直到找到匹配项或耗尽序列。与regex_match()一样,您可以选择提供一个match_results struct来接收搜索结果,以及一个match_flag_type位掩码来控制如何计算匹配。regex_search与regex_match相似,但是不要求完全匹配,只要一个子表达式匹配就返回true。

/**

*查找子字符串readme.md或readme.txt是否存在于输入字符串

**/

#include

#include

#include

#include

intmain(intargc,char*argv[]) {

usingnamespaceboost::xpressive;

std::stringline="The readme.md is here. Where is the doumention named readme.txt?";

smatchwhat;

sregexregex=sregex::compile("readme\\.\\w+");

if(regex_search(line,what,regex)) {

std::cout

for(size_ti=;i

std::cout

}

}

system("pause");

return;

}

==================================================================================================

程序运行结果:

查询记录条数:1

readme.md

替换

使用regex_replace()执行搜索和替换非常简单。您所需要的是输入序列、regex对象、格式字符串或格式化程序对象。

/**

*

**/

#include

#include

#include

#include

intmain(intargc,char*argv[]) {

usingnamespaceboost::xpressive;

std::stringsource="Boost.Regex is a useful regex library,and Regex is efficient.";

sregexregex=sregex::compile("(Regex)");

std::stringformat="Xpressive";

std::stringdest=regex_replace(source,regex,format);

std::cout

std::cout

system("pause");

return;

}

==================================================================================================

程序运行结果:

Boost.Regexisausefulregexlibrary,andRegexisefficient.

Boost.Xpressiveisausefulregexlibrary,andXpressiveisefficient.

遍历

regex_iterator

查找与regex匹配的所有子字符串,并一次逐个遍历它们。regex_iterator解引用返回的是一个match_results。使用*或者->获取匹配的结果match_results对象的值。

/**

*将[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]中的所有数字提取出来

**/

#include

#include

#include

#include

intmain(intargc,char*argv[]) {

usingnamespaceboost::xpressive;

std::stringline="[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]";

sregexregex=sregex::compile("((\\d+)?\\.(\\d+))");

sregex_iteratorit_begin(line.begin(),line.end(),regex);

sregex_iteratorit_end;

for(sregex_iteratorit=it_begin;it!=it_end;it++) {

std::coutstr()

}

system("pause");

return;

}

==================================================================================================

程序运行结果:

0.0001

0.0002

0.0003

0.0004

0.0005

0.0006

regex_token_iterator

//regex_token_iterator的构造方法

//1

regex_token_iterator(BidiIterbegin,BidiIterend,

basic_regexconst&rex);

//2

template

regex_token_iterator(BidiIterbegin,BidiIterend,

basic_regexconst&rex,unspecifiedargs);

//3

template

regex_token_iterator(BidiIterbegin,BidiIterend,

basic_regexconst&rex,

Subsconst&subs,

regex_constants::match_flag_typeflags=regex_constants::match_default);

//4

template

regex_token_iterator(BidiIterbegin,BidiIterend,

basic_regexconst&rex,

Subsconst&subs,unspecifiedargs,

regex_constants::match_flag_typeflags=regex_constants::match_default);

Parameters:

args:Alet()expressionwithargumentbindingsforsemanticactions. (detail::let_const&args)

begin:搜索序列的begin()

end:搜索序列的end()

flags:可选的匹配标志,用于控制表达式如何与序列匹配(Seematch_flag_type.)

rex:正则表达式

subs:Arangeofintegersdesignatingsub-matchestobetreatedastokens.subsiseitheranintegergreaterorequalto-1,orelseanarrayornon-emptystd::vectorofsuchintegers. (subs大于或等于-1的整数,数组或非空std::vector的这些整数)

使用构造方法_1

regex_token_iterator(BidiIter begin, BidiIter end, basic_regexconst & rex);使用该构造方法的操作结果regex_iterator遍历匹配结果一致。

/**

*将[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]中的所有数字提取出来

**/

#include

#include

#include

#include

intmain(intargc,char*argv[]){

usingnamespaceboost::xpressive;

std::stringline="[0.0001 0.0002 0.0003][0.0004 0.0005 0.0006]";

sregexregex=sregex::compile("((\\d+)?\\.(\\d+))");

sregex_token_iteratorit_begin(line.begin(),line.end(),regex);

sregex_token_iteratorit_end;

for(sregex_token_iteratorit=it_begin;it!=it_end;it++) {

std::coutstr()

}

system("pause");

return;

}

==================================================================================================

程序运行结果:

0.0001

0.0002

0.0003

0.0004

0.0005

0.0006

使用构造方法_3

template

regex_token_iterator(BidiIterbegin,BidiIterend,

basic_regexconst&rex,

Subsconst&subs,

regex_constants::match_flag_typeflags=regex_constants::match_default);

使用regex_token_iterator的这个构造方法,通过传入配置参数Subs const & sub实现不用的需求。sub使用不同的值将得到不同的sub_match的结果:sub = -1:返回与正则表达式不匹配的字符串。相当于把正则表达式部分作为分隔符来使用。sub = 0 :返回与正则表达式完全匹配的字符串。sub = 1、2 ... n:返回与正则表达式匹配的n个子匹配的字符串(由第n个sub-expression匹配)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180701G15SYW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券