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