随笔 - 31  文章 - 128  trackbacks - 0
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(5)

随笔分类(38)

随笔档案(31)

收藏夹(4)

College

High School

最新随笔

搜索

  •  

积分与排名

  • 积分 - 55112
  • 排名 - 411

最新评论

  • 1. re: [yc]详解link
  • 面试的时候面试官就问过我什么是编译和链接,我说编译就是把代码文件生成目标文件,链接就是把目标文件生成可执行文件,他说不对,又问我什么是动态链接,还问我预编译都做什么处理。。。都在这里找到了答案!!!!
  • --王至乾
  • 2. re: [yc]详解link
  • @刘伟
    我是说博主,不是叫你啊
  • --溪流
  • 3. re: [yc]详解link
  • 谁是石老师,我不是哈@溪流
  • --刘伟
  • 4. re: [yc]详解link
  • 石老师?我是溪流~
  • --溪流
  • 5. re: [yc]详解link
  • 期待楼主下文啊,多谢楼主了
  • --刘伟

阅读排行榜

评论排行榜

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 阅读(3095) 评论(4)  编辑 收藏 引用 所属分类: templateBoostC++

FeedBack:
# re: Xpressive简介 2006-10-22 08:56 pluskid
传统的正则表达式都有一个通病,使用字符串来表示,虽然 perl 这样的语言对正则表达式有了“专门”的语法,不需要处理字符串里面 \ 转义的问题,仍然是换汤不换药。正则表达式复杂一点就很难读懂了,而且为正则表达式添加和维护注视及其困难。有没有考虑过用一些类、functor 一类的东西来做正则表达式呢?例如,这样类似的语法:
sequence( any-times( any-char ),
not( plain-char('~') ),
end-of-string )
这样有清晰的结构,而且可以控制缩进及换行并方便地加注释。
这个 idea 我是从 scsh[1] 看到的。

Footnotes:
[1] scsh -- a Scheme Shell. Scheme -- a Lisp dialect. See
http://www.scsh.net/docu/html/man-Z-H-7.html#node_chap_6
for SRE(An s-expression notation for writing down general regular expressions)  回复  更多评论
  
# re: Xpressive简介 2006-10-22 08:59 pluskid
@pluskid
哎呀~~前面的空格被删掉了,缩进不漂亮了,T_T  回复  更多评论
  
# re: Xpressive简介 2006-10-22 09:53 Francis Arcanum
前面的静态文法不就是这样子的么  回复  更多评论
  
# re: Xpressive简介 2006-12-22 16:19 小山日志
关注...  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理