1、regex_match :如果整个字符串与表达式匹配,返回true
2,regex_search:如果字符串中有子串与表达式匹配,返回true
string str(R"([email protected])" );
//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格式处理
如下,匹配到[email protected] [email protected] [email protected]三个结果,每个结果都跟子表达式一一对应
2. 对于[email protected]来说 $1 = a; $2 = @; $3 = bc.com; 则fmt = a#@ 则str中的[email protected]替换为a#@
同理[email protected] 来说 $1 = d; $2 = @; $3 = ef.com; 则fmt = d#@ 则str中的[email protected]替换为d#@
*/
string str("[email protected], [email protected], [email protected]");
regex e("([[:w:]]+)(@)([[:w:]]+\\.com)");//注意@被()括起来,所以是一个子表达式
string fmt = "$1#$2";
cout << regex_replace(str, e, fmt);
}
4.sregex_iterator:用于找到所有匹配结果
void sregexIterator( )
{
string str("[email protected], [email protected], [email protected]" );
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。
smatch与ssub_match区别:
smatch相当于一个字符串数组,ssub_match相当于一个字符串,ssub_match可以认为是smatch的一个元素,ssub_match = samtch[0]
注意:
1.避免创建不必要的正则表达式。因为正则表达式是在运行时编译的,构造一个regex对象或赋值是非常耗时的。