c++ 正则表达式string拆分字符串

 

1、regex_match :如果整个字符串与表达式匹配,返回true

2,regex_search:如果字符串中有子串与表达式匹配,返回true

    string str(R"(a_@313bb.com)" );

    //regex re("([[:w:]]+)@([[:w:]]+\\.com)");
	regex re("([[:w:]]+)@([[:w:]]+\\.com)");//[:w:]],字母,数字,下划线
	bool matchRes = regex_match(str.begin(), str.end(), re);
	bool searchRes = regex_search(str.begin(), str.end(), re);
    
   //regex_search只要匹配成功一个就会返回

3.   regex_replace:字符串替换

void replace()
{
	//regex_replace(str, re, fmt);
	//str:要查找的字符串
	//re 正则表达式
	//fmt 替换格式, 
	/*
	 匹配结果:每个完整表达式的匹配结果根据fmt替换,默认未匹配的原样输出, 
	 若要丢弃不匹配的子串需要调用regex_replace(str, re, fmt, format_no_copy)
	 */
	
	/*匹配过程 :$1表示 第一个子表达式([[:w:]]+)匹配到的字符串
	以fmt = "$1#$2"为例;
	1.先获取匹配结果,对结果按照fmt格式处理
	如下,匹配到a@bc.com   d@ef.com  aa@bb.com三个结果,每个结果都跟子表达式一一对应
	2. 对于a@bc.com来说 $1 = a; $2 = @; $3 = bc.com; 则fmt = a#@ 则str中的a@bc.com替换为a#@
	同理d@ef.com 来说 $1 = d; $2 = @; $3 = ef.com;  则fmt = d#@ 则str中的d@ef.com替换为d#@
	*/
	string str("a@bc.com, d@ef.com, aa@bb.com");
	regex e("([[:w:]]+)(@)([[:w:]]+\\.com)");//注意@被()括起来,所以是一个子表达式
	string fmt = "$1#$2";
	cout << regex_replace(str, e, fmt);
}

4.sregex_iterator:用于找到所有匹配结果

void sregexIterator( )
{
	 string str("a@bc.com, d@ef.com, aa@b.com" );
     regex e("([[:w:]]+)@([[:w:]]+\\.com)");//[[:w:]] 匹配字母,数字,字符串
	//子表达式:一个()内的是一个子表达式,
	//"([[:w:]]+)@([[:w:]]+\\.com)" 有1.([[:w:]]+)  2.([[:w:]]+\\.com)两个子表达式
	//"([[:w:]]+)(@)([[:w:]]+\\.com)"有1.([[:w:]]+)  2.@  3.([[:w:]]+\\.com三个子表达式
	//smatch是一个数组,保存的就是匹配的子串和所有子表达式匹配的字符串
	sregex_iterator begin(str.begin(), str.end(), e); // 定义 regex_iteraror
	sregex_iterator end;
	for (auto iter = begin ; iter != end;++iter)
	{
		smatch res = *iter;//sregex_iterator由smatch保存
		cout<

5.保存匹配的结果,注意类型的匹配:smatch保存匹配结果, ssub_match保存匹配结果前缀与后缀字符串, 例如 asas222ddd,regrex配到到222,则222存储类型为smatch, asas和ddd存储类型为ssub_match。 

c++ 正则表达式string拆分字符串_第1张图片

smatch与ssub_match区别:

smatch相当于一个字符串数组,ssub_match相当于一个字符串,ssub_match可以认为是smatch的一个元素,ssub_match  =  samtch[0]

注意:

1.避免创建不必要的正则表达式。因为正则表达式是在运行时编译的,构造一个regex对象或赋值是非常耗时的。

你可能感兴趣的