用正则表达式分离C++字符串string,写了一个小例子。
#include "stdafx.h"
#include <regex>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
#define PATTERN "[\\S]+"
//通过正则式pattern分割字符串
void splitString( string str, string pattern, vector<string>& vect)
{
regex pattern( pattern );
const std::sregex_token_iterator end;
for (std::sregex_token_iterator i( str.begin(), str.end(), pattern); i != end ; ++i) {
std::cout << *i << std::endl;
vect.push_back( *i );
}
}
int main()
{
string str = " ! 1 s bodyright_unablation.grd";
vector<string> v;
splitString( str, PATTERN, v );
for( int i = 0; i < v.size(); i ++ ){
cout << v[i] << endl;
}
return 0;
}
其中重要的知识点来自http://blog.sina.com.cn/s/blog_ac9fdc0b0101oow9.html
****************************************************************************************************
正则表达式语法
正则表达式的特性分成很多种类,下面的内容是perl类型的Regex。
============================================================================================
特殊含义的字符
. :任意单个字符
[] :字符集
{} :计数
() :子模式
\ :下一个字符具有特殊含义
* :0个或多个
+ :一个或多个
? :0个或一个
| :或
^ :行的开始;否定
$ :行的结束
===========================================================================================
字符集
\d :一个十进制数字
\l :一个小写字母
\s :一个空白符(空格符,制表符等)
\u :一个大写字母
\w :一个字母(a~z或A~Z)或数字(0~9)或下划线(_)
\D :除了\d之外的字符
\L :除了\l之外的字符
\S :除了\s之外的字符
\U :除了\u之外的字符
\W :除了\w之外的字符
===========================================================================================
重复
{n} :严格重复n次
{n,} :重复n次或更多次
{n,m}:重复至少n次,至多m次
* :{0,}
+ :{1,}
? :{0,1}
===========================================================================================
子模式
为了指定模式中的子模式,用括号将其括起来
(\d*:)?(\d+):它表示字符串前半部分可以为空,若非空,则是任意长度的数字后接一个冒号,后半部分是一个或多个数字的序列。
===========================================================================================
可选项
| 表示二选一的概念。
Subject:(FW:| Re:):表示匹配Subject:Fw:或者是Subject:Re:
===========================================================================================
正则表达式错误
当我们将一个模式富裕regex时,它会对模式进行检查,如果发现模式不合法或过于复杂,无法用于匹配时,它会抛出一个bad_expression异常。