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
内有详细的文档
posted on 2006-07-27 16:27
shifan3 阅读(3090)
评论(4) 编辑 收藏 引用 所属分类:
template 、
Boost 、
C++