[yc]Xpressive简介

[yc]Xpressive简介
Xpressive是一个C++的正则表达式库,目前是Boost的候选库。
Xpressive和Boost.Regex的区别很大。首先,Xpressive是一个纯头文件的库,也是说,在使用之前不需要预先编译。其次,Xpressive支持类似于Spirit的静态语义定义。

我们先来看一个例子:

 

#include  < iostream >
#include 
< boost / xpressive / xpressive.hpp >

using   namespace  boost::xpressive;

int  main()
{
    std::
string  hello(  " hello world! "  );

    sregex rex 
=  sregex::compile(  " (\\w+) (\\w+)! "  );
    smatch what;

    
if ( regex_match( hello, what, rex ) )
    {
        std::cout 
<<  what[ 0 <<   ' \n ' //  whole match
        std::cout  <<  what[ 1 <<   ' \n ' //  first capture
        std::cout  <<  what[ 2 <<   ' \n ' //  second capture
    }

    
return   0 ;
}

这是使用Xpressive动态语义定义的例子,其中sregex::compile函数编译一个表示正则文法的串,并返回一个正则对象sregex
使用regex_match来使用这个正则对象匹配一个串。结果储存在what内
其中what[0]返回整个串,what[1]~what[n]返回文法中用于标记的部分(用小括号括起来的部分)
最后将输出
     hello world!
     hello
     world

如果想在一个串中查找符合该文法的子串,可以使用regex_search,用法和regex_match一样,此外还可以用regex_replace来进行替换。

 


静态文法:
Xpressive除了可以用compile来分析一个文法串之外,还可以用类似于Spirit的方式来静态的指定文法:

sregex re  =   ' $ '   >>   + _d  >>   ' . '   >>  _d  >>  _d;

这将定义一个表示金额的串,其中_d表示一个数字,相当于串 $\d+.\d\d
这样定义文法将比之前的动态定义更加高效,并且还有一个附加的好处:
分级定义:

sregex re  =   ' $ '   >>   + _d  >>   ' . '   >>  _d  >>  _d;
sregex s 
=   ' ( '   >>  re  >>   ' ) ' ;

这样s表示为用括号括起来的re
通过分级定义,文法能被表示的更加清楚。
更加棒的是,分级定义还可以向后引用,因此能够分析EBNF

sregex group, factor, term, expression;
group       
=   ' ( '   >>  by_ref(expression)  >>   ' ) ' ;
factor      
=   + _d  |  group;
term        
=  factor  >>   * (( ' * '   >>  factor)  |  ( ' / '   >>  factor));
expression  
=  term  >>   * (( ' + '   >>  term)  |  ( ' - '   >>  term));

expression定义了一个四则表达式,注意其中group的定义。
这里必须使用by_ref是因为Xpressive默认是值拷贝,如果这里使用默认的方式,那么会造成一个无限循环。


Xpressive可以在这里下载
http://boost-consulting.com/vault/index.php?PHPSESSID=f1d4af8b742cfa7adae7aab373cfc535&direction=0&order=&directory=Strings%20-%20Text%20Processing&PHPSESSID=f1d4af8b742cfa7adae7aab373cfc535
内有详细的文档

你可能感兴趣的:([yc]Xpressive简介)