美洲杯波胆_美洲杯波胆赔率
做最好的网站
来自 计算机教程 2019-08-01 12:06 的文章
当前位置: 美洲杯波胆 > 计算机教程 > 正文

【美洲杯波胆】C boost 正则表达式用法

C 11开始支持正则表达式,使得处理文本更加简洁方便。C 11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expressions), extended(POSIX Extended Regular Expressions ), awk(POSIX awk) , grep(POSIX grep ), egrep(POSIX grep –E)。其中ECMAScript最为强大。

什么是正则表达式?正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。
如果您不知道什么是正则表达式,请看这篇文章http://blog.csdn.net/begtostudy/archive/2007/11/11/1879206.aspx

闲话不多说,首先来看正则表达式有哪些基本类型。

有了正则表达式的基础,问题是如何使用。我们以boost::regex来说

  1. basic_regex: 这是一个包含一个正则表达式的模板类。通常有两种特化方式:

先看一个网上经典的例子。

a)    typedef basic_regex<char> regex;

#include "stdafx.h"

b)    typedef basic_regex<wchar_t> wregex;

#include <cstdlib>

     2. match_results:  这个类包含了与给定正则表达式匹配的序列。当empty()成员返回true或者size()成员返回0,表明没有找到匹配项。否则,当empty()返回false,size()返回值>=1 表明发生了匹配。此外:match[0]: 代表整个匹配序列 ;match[1]:代表第一个匹配子序列 ;match[2]: 代表第二个匹配子序列,以此类推。match_results有如下特化方式:

#include <stdlib.h>

a)    typedef match_results<const char*> cmatch;

#include <boost/regex.hpp>

b)    typedef match_results<const wchar_t*> wcmatch;

#include <string>

c)     typedef match_results<string::const_iterator> smatch;

#include <iostream>

d)    typedef match_results<wstring::const_iterator> wsmatch;

using namespace std;

    3. sub_match: 该模板类用来表示与一个已标记的子表达式匹配的序列。这个匹配是通过一个迭代器对来表示的,该迭代器对表明了已匹配的正则表达式的一个范围。可以特化为下面几种情况:

using namespace boost;

a)    typedef sub_match<const char*>             csub_match;

regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");

b)    typedef sub_match<const wchar_t*>          wcsub_match;

int main(int argc, char* argv[])

c)     typedef sub_match<string::const_iterator>                 ssub_match;

{

d)    typedef sub_match<wstring::const_iterator>               wssub_match;

 std::string in;

以上介绍了一种常用的类型,叙述可能比较抽象,后面会结合例子来介绍这些类型的用法,还是会比较好理解。

 cmatch what;

然后来认识一下操作正则表达式的一些常用算法。

 cout << "enter test string" << endl;

template <class charT,class Allocator,class traits >

 getline(cin,in);

bool regex_match(

 if(regex_match(in.c_str(), what, expression))

const charT* str,

 {

match_results<const charT*,Allocator>& m,

for(int i=0;i<what.size();i )

const basic_regex<charT,traits >& e,

 cout<<"str :"<<what[i].str()<<endl;

match_flag_type flags = match_default);

 }

regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。注意,这个正则表达式必须匹配被分析串的全部,否则函数返回 false. 如果整个序列被成功匹配,regex_match 返回 True.

 else

 

 {

 

cout<<"Error Input"<<endl;

template <class traits,class charT>

 }

basic_string<charT> regex_replace(

 return 0;

const basic_string<charT>& s,

}
 
==============
结果
输入:select name from table

const basic_regex<charT,traits >& e,

输出:str:select name from table

const basic_string<charT>& fmt,

 str:name

match_flag_type flags = match_default);

 str:table

regex_replace 在整个字符序列中查找正则表达式e的所有匹配。这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行格式化。缺省情况下,不匹配的文本不会被修改,即文本会被输出但没有改变。

按照我们的要求,字符串被匹配挑出来了。
这在处理大量规则的文本格式的时候很有用,因为它很灵活,一通百通。

template <class charT,class Allocator, class traits>
  bool regex_search(
    const charT* str,
    match_results<const charT*,Allocator>& m,
    const basic_regex<charT,traits >& e,
    match_flag_type flags = match_default);

首先,即使你拥有了boost库,也需要单独编译regex。
如果你不知道boost库,看这里http://www.stlchina.org/twiki/bin/view.pl/Main/BoostStartIntroduce

regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。你可以用 regex_search 来查找输入中的一个子序列,该子序列匹配正则表达式 e.

网上的介绍:
boost库安装比较麻烦,需要自己编译源文件,我整理了一下,如果仅仅需要做正则表达式,按下面的代码敲就行了:

 

cmd

迭代器介绍:正则表达式迭代器用来遍历这个正则表达式序列,通过一个迭代器区间来表示匹配的区间。

vcvars32.bat

  1. regex_iterator:

cd D:boost_1_32_0libsregexbuild

a)         typedef regex_iterator<const char*>            cregex_iterator;

d:

b)         typedef regex_iterator<const wchar_t*>         wcregex_iterator;

nmake -fvc6.mak

c)         typedef regex_iterator<string::const_iterator>    sregex_iterator;

nmake -fvc6.mak install

d)         typedef regex_iterator<wstring::const_iterator>   wsregex_iterator;

注意,别看下载下来的数据包没有多大,解压缩之后达到了100多M,编译完之后为109M,占用131M,所以安装时一定注意空出足够的空间,敲入nmake -fvc6.mak后等待的时间比较长,屏幕上还会出现一大堆英语,可以不做考虑。按照步骤往下敲就行了。压缩包内文档很详细,参照文档继续就可以了。

     2. regex_token_iterator:

在VC6中集成:Tools->Options->Directories->Include files

a)         typedef regex_token_iterator<const char*>                     cregex_token_iterator;

加入:D:boost_1_32_0

b)         typedef regex_token_iterator<const wchar_t*>             wcregex_token_iterator;

我用的是VS2003
做了run.bat

c)         typedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;

chdir E:Programboost_1_34_1

d)         typedef regex_token_iterator<wstring::const_iterator>  wsregex_token_iterator;

bjam "-sTOOLS=vc-7_1" "-sVC71_ROOT=D:Program FilesMicrosoft Visual Studio .NET 2003Vc7"  "--prefix=E:Programboost" "--builddir=E:Programboost_1_34_1build" "-sBUILD=debug release <runtime-link>static/dynamic" --with-regex install


PAUSE

至于参数,需要参考boost安装介绍http://blog.csdn.net/begtostudy/archive/2007/11/11/1879213.aspx

其他的一些介绍

本文由美洲杯波胆发布于计算机教程,转载请注明出处:【美洲杯波胆】C boost 正则表达式用法

关键词: