Xpressive是一個(gè)C++的正則表達(dá)式庫(kù),目前是Boost的候選庫(kù)。
Xpressive和Boost.Regex的區(qū)別很大。首先,Xpressive是一個(gè)純頭文件的庫(kù),也是說(shuō),在使用之前不需要預(yù)先編譯。其次,Xpressive支持類似于Spirit的靜態(tài)語(yǔ)義定義。
我們先來(lái)看一個(gè)例子:
#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動(dòng)態(tài)語(yǔ)義定義的例子,其中sregex::compile函數(shù)編譯一個(gè)表示正則文法的串,并返回一個(gè)正則對(duì)象sregex
使用regex_match來(lái)使用這個(gè)正則對(duì)象匹配一個(gè)串。結(jié)果儲(chǔ)存在what內(nèi)
其中what[0]返回整個(gè)串,what[1]~what[n]返回文法中用于標(biāo)記的部分(用小括號(hào)括起來(lái)的部分)
最后將輸出
hello world!
hello
world
如果想在一個(gè)串中查找符合該文法的子串,可以使用regex_search,用法和regex_match一樣,此外還可以用regex_replace來(lái)進(jìn)行替換。
靜態(tài)文法:
Xpressive除了可以用compile來(lái)分析一個(gè)文法串之外,還可以用類似于Spirit的方式來(lái)靜態(tài)的指定文法:
sregex re = '$' >> +_d >> '.' >> _d >> _d;
這將定義一個(gè)表示金額的串,其中_d表示一個(gè)數(shù)字,相當(dāng)于串 $\d+.\d\d
這樣定義文法將比之前的動(dòng)態(tài)定義更加高效,并且還有一個(gè)附加的好處:
分級(jí)定義:
sregex re = '$' >> +_d >> '.' >> _d >> _d;
sregex s = '(' >> re >> ')';
這樣s表示為用括號(hào)括起來(lái)的re
通過(guò)分級(jí)定義,文法能被表示的更加清楚。
更加棒的是,分級(jí)定義還可以向后引用,因此能夠分析EBNF
sregex group, factor, term, expression;
group = '(' >> by_ref(expression) >> ')';
factor = +_d | group;
term = factor >> *(('*' >> factor) | ('/' >> factor));
expression = term >> *(('+' >> term) | ('-' >> term));
expression定義了一個(gè)四則表達(dá)式,注意其中g(shù)roup的定義。
這里必須使用by_ref是因?yàn)閄pressive默認(rèn)是值拷貝,如果這里使用默認(rèn)的方式,那么會(huì)造成一個(gè)無(wú)限循環(huán)。
Xpressive可以在這里下載
http://boost-consulting.com/vault/index.php?PHPSESSID=f1d4af8b742cfa7adae7aab373cfc535&direction=0&order=&directory=Strings%20-%20Text%20Processing&PHPSESSID=f1d4af8b742cfa7adae7aab373cfc535
內(nèi)有詳細(xì)的文檔
posted on 2006-07-27 16:27
shifan3 閱讀(3116)
評(píng)論(4) 編輯 收藏 引用 所屬分類:
template 、
Boost 、
C++