boost::regex支持perl regular表达式、POSIX-Extended regular表达式和POSIX-Basic Regular表达式,但默认的表达式语法是perl语法,如果要使用其余两种语法需要在构造表达式的时候明确指定。
perl正则表达式语法简介如下:
. 任意字符;使用match_no_dot_null标志时不匹配NULL字符; 使用match_not_dot_newline时不匹配换行字符
^ 匹配行的开始
$ 匹配行的结束
* 重复零次或则更多,例如a*b可匹配b,ab,aab,aaaaaaab
+ 重复一次以上,例如a+b可匹配ab,aab,aaaaaaaab。但不能匹配b了
? 零次或则一次,例如ca?b匹配cb,cab但不匹被caab
a{n} 匹配字符''a''重复n次
a{n,},字符a重复n次以上(含n次)
a{n,m} a重复n到m次(含)
*? 匹配前一个原子零次以上
+? 匹配前一个原子一次以上
?? 匹配前一个原子零次以上
{n,}? 匹配前一个原子n次以上(含)
{n,m? 匹配前一个原子n到m次(含)
| 或操作,例如ab(d|ef)匹配abd或则abef
[] 字符集操作,例如[abc]将匹配任何单个字符''a'',''b'',''c''
[a-d],表示a、b、c、d
^否操作,例如[^a-c]表示a至c之外的所有字符
使用boost库实现正则表达式代码示例如下,
代码示例1:
#include<iostream>
#include<string>
#include<assert.h>
#include<boost/regex.hpp>
using namespace std;
int main(int argc, char** argv)
{
boost::regex re("(\w+):(\d+)");
//full match
string txt1 = "ruby:123";
string txt2 = "ruby:123s";
assert(true == boost::regex_match(txt1, re));
assert(false == boost::regex_match(txt2, re));
//partial match
assert(true == boost::regex_search(txt2, re));
//extract sub-pattern
boost::match_results<string::const_iterator> what;
if (regex_match(txt1, what, re, boost::match_default))
{
assert("ruby" == what[1]);
assert("123" == what[2]);
}
return 0;
}
代码示例2:
#include "stdafx.h"
#include <cstdlib>
#include <stdlib.h>
#include <boost/regex.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace boost;
regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");
int main(int argc, char* argv[])
{
std::string in;
cmatch what;
cout << "enter test string" << endl;
getline(cin,in);
if(regex_match(in.c_str(), what, expression))
{
for(int i=0;i<what.size();i++)
cout<<"str :"<<what[i].str()<<endl;
}
else
{
cout<<"Error Input"<<endl;
}
return 0;
}
运行结果:
输入:select name from table
输出:
str:select name from table
str:name
str:table