boost regex 详解

本文详细介绍了Boost库中的正则表达式模块,包括支持的语法、使用示例和不同类型的正则表达式选项。重点讲解了perl正则表达式的常见符号,如.^$*+?{n,m}等,并提到了Unicode编码支持和大小写不敏感匹配。此外,还概述了boost::regex的相关类,如basic_regex、sub_match和match_results,以及相关算法如regex_match、regex_search和regex_replace的应用场景和使用方法。" 118953410,10539625,C语言实训与程序设计经验分享,"['C语言', '编程实训', '程序设计', '指针操作', '结构化编程']
摘要由CSDN通过智能技术生成

boost::regex的默认正则表达式语法是perl语法
        boost::regex支持perl regular表达式、POSIX-Extended regular表达式和POSIX-Basic Regular表达式,但默认的表达式语法是perl语法,如果要使用其余两种语法需要在构造表达式的时候明确指定。

        例如,下面两种方法效果相同
        // e1 is a case sensitive Perl regular expression:
        // since Perl is the default option there's no need to explicitly specify the syntax used here:
        boost::regex e1(my_expression);
        // e2 a case insensitive Perl regular expression:
        boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);

perl正则表达式语法
        perl正则表达式语法可参见《perl语言入门》第7、8、9章或boost的文档。这里列出的语法是不全面的,而且部分说明可能并不清楚。

        . 任意字符;使用match_no_dot_null标志时不匹配NULL字符; 使用match_not_dot_newline时不匹配换行字符

        ^ 匹配行的开始
        $ 匹配行的结束
        * 重复零次或则更多,例如a*b可匹配b,ab,aab,aaaaaaab
        + 重复一次以上,例如a+b可匹配ab,aab,aaaaaaaab。但不能匹配b了
        ? 零次或则一次,例如ca?b匹配cb,cab但不匹被caab   
        a{n} 匹配字符'a'重复n次
        a{n,},字符a重复n次以上(含n次)
        a{n,m} a重复n到m次(含)

        *?   匹配前一个原子零次以上
        +?   匹配前一个原子一次以上
        ??   匹配前一个原子零次以上
        {n,}?  匹配前一个原子n次以上(含)
        {n,m?  匹配前一个原子n到m次(含)

        | 或操作,例如ab(d|ef)匹配abd或则abef
        [] 字符集操作,例如[abc]将匹配任何单个字符'a','b','c'
        [a-d],表示a、b、c、d
        ^否操作,例如[^a-c]表示a至c之外的所有字符


boost::regex对unicode编码的支持
        boost::regex使用ICU来实现对unicode及unicode变种的支持,这需要在编译boost的时候指出是否使用ICU以及ICU所在的目录。否则编译出来的boost::regex不支持unicode编码。其中boost::wregex支持unicode编码的搜索,如果要搜索UTF-8、UTF-16、UFT-32编码的字符串,则要用boost::u32regex。注意boost::wregex只能支持unicode编码,不能支持uft编码。

搜索时如何忽略大小写
        如果要在搜索时忽略大小写(即大小写不敏感),则要用到表达式选项boost::regex::icase,例如: boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);

 

模板类:

l         basic_regex          用来保存一个“正则表达式”的类。

l         sub_match            继承于pair<Iterator,Iterator>迭代器组,用来表示匹配的一个结果。

l         match_results             sub_match的容器,用来表示一次搜索或匹配算法的所有结果,类似于vector<sub_match>。

算法:

l         regex_math   匹配算法,测试一个字符串是否和一个正则式匹配,并通过match_results返回结果。

l         regex_find     查找算法,查找字符串的一个和正则式匹配的字串,并通过match_results返回结果。

l         regex_format       替换算法,查找字符串中的所有匹配正则式的字串,并使用“格式化字符”串替换。

迭代器:

l         regex_iterator      枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于match_results。

l         regex_token_iterator 枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于sub_match

 

详述

l       basic_regex

template <class charT, class traits = regex_traits<charT>, class Allocator = std::allocator<charT>  >

class basic_regex;

typedef basic_regex<char> regex;

typedef basic_regex<wchar_t> wregex;

很明显,charT是正则式的字符类型,regex和wregex是basic_regex的两个特化。

注意,正则式的字符类型要和需要匹配的字符串的字符类型相同。例如:不能在regex_find算法中分别使用string和wregex最为参数,要么是string和regex,要么是wstring和wregex。

构造函数:

basic_regex re

产生空的正则式

basic_regex re(str)

正则式为str,str可以为basic_string,也可以是0结尾的char*字符串。

Basic_regex re(re2)

拷贝构造。

basic_regex re(str,flag)

正则式为str,使用flag语法选项,flag是一组常量的组合。例如:icase可以使正则式匹配忽略大小写。

basic_regex re(beg,end)

使用迭代器构造正则式。可以是basic_string的迭代器,也可以是const char*。

basic_regex re(beg,end,flag)

使用迭代器构造正则式,flag是语法选项。

常用的语法选项:

regex_constants::normal

默认的语法。符合EMCAScript,JavaScript中的正则式。

regex_constants::icase

匹配的时候忽略大小写。

regex_constants::nosubs

不把匹配的子串保存进match_results结构。

regex_constants::collate

对于[a-b]的匹配,考虑地区

 

语法选项通过或运算来结合。在basic_regex中这些语法选项也进行了定义,所以可以写成regex::normal,这要比regex_constants少打好几个字母了吧!J

assign成员函数:

re.assign(re2)

复制一个正则式

re.assign(str)

正则式为str。

re.assign(str, flag)

正则式为str,使用flag语法选项,flag是一组常量的组合。

re.assign(beg, end)

使用迭代器构造正则式。

re.assign(beg, end, flag)

使用迭代器构造正则式,flag是语法选项。

 

其实basic_regex很多用法和basic_string很像,因为正则表达式也是个字符串嘛!

迭代器:

regex::iterator it

常迭代器类型,即const_iterator

re.begin()

返回的是常迭代器哦!const_iterator

re.end()

没有逆向迭代器。

例如:copy(re.begin(), re.end(), ostream_iterator<char>(cout));

其他:

re.size()

正则表达式长度,即str的长度。

re.max_size()

正则表达式的最大长度。

re.empty()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值