网站建设费会计账务处理,企业信息管理系统官网,重庆网络公司产品设计,企业展示厅设计效果图C11 新增了正则表达式的标准库支持#xff0c;本文简介 C 正则表达式的使用在 C 中使用正则表达式#xff0c;和其它语言差别不大int main() {regex e(abc*);bool m regex_search(abccc, e);// 输出 yescout (m ? yes : 11 新增了正则表达式的标准库支持本文简介 C 正则表达式的使用在 C 中使用正则表达式和其它语言差别不大int main() {regex e(abc*);bool m regex_search(abccc, e);// 输出 yescout (m ? yes : no) endl;
}
C11 自带了 6 种正则表达式语法的支持ECMAScriptbasicextendedawkgrepegrepC11 默认使用 ECMAScript 语法这也是 6 种语法中最强大的假如想使用其他 5 种语法只需在声明 regex 对象时指定即可regex e(^a., regex_constants::grep);
假如我们不仅仅想知道一个正则表达式是否匹配一个字符串我们还想要提取出匹配的部分例如我们需要从邮箱中提取用户名和网址就需要用到 match_resultsint main() {string str(Email abc.com abc);// 等同于 match_resultsstringsmatch m; regex e(([[:w:]])([[:w:]].com));bool found regex_search(str, m, e);// m.size3, 存储了 3 个 resultcout m.size m.size() endl;/* 迭代 match_results, 输出m[0]abc.com (整个匹配)m[1]a (第1个group)m[2]bc.com (第2个group)*/for (int n0; nm.size(); n){cout m[ n ] m[n].str() endl;//等价写法 m.str(n), *(m.begin()n) }// m.prefixEmailcout m.prefix m.prefix().str() endl;// m.suffix is minecout m.suffix m.suffix().str() endl;
}
假如我们想要匹配的字符串中有多个子串都可以匹配正则表达式并且我们想把这些子串全部找出来例如一个字符串中包含多个邮箱地址那么就需要用到 regex_iteratorint main() {string str(abc.com, def.com, aab.com);regex e(([[:w:]])([[:w:]].com));sregex_iterator pos(str.cbegin(), str.cend(), e); // 定义 regex_iteraror// C惯例: 默认构造的迭代器表示序列结束sregex_iterator end;/*
emailabc.com, usera, domainbc.com
emaildef.com, userd, domainef.com
emailaabb.com, useraa, domainb.com
*/for (; pos!end; pos) {cout email pos-str(0) , user pos-str(1) , domain pos-str(2) endl;}
}
如上我们可以看到regex_iterator 其实就是迭代字符串中所有正则表达式匹配的 match_results。除此之外C 还提供了另一种跌到器, regex_token_iterator。不同的是regex_token_iterator 迭代的是所有正则表达式匹配中的指定子表达式或迭代未匹配的子字符串int main() {string str(abc.com, def.com, aabb.com);regex e(([[:w:]])([[:w:]].com));sregex_token_iterator pos(str.cbegin(), str.cend(), e); // 定义regex_token_iteratorsregex_token_iterator end; //序列结束/*Matched: abc.comMatched: def.comMatched: aabb.com*/for (; pos!end; pos) {cout Matched: *pos endl;}
}
我们可以修改 pos 的定义使它每次迭代 match_results 的第 2 个 group// 第 4 个参数表示第几个 group
sregex_token_iterator pos(str.cbegin(), str.cend(), e, 2
);
值得注意的是如果我们把这里的参数设为 -1则迭代字符串中所有不匹配正则表达式的部分相当于用正则表达式切割字符串int main() {string str(a bb cd);regex e(s); // 匹配空格// 迭代不匹配正则表达式的部分sregex_token_iterator pos(str.cbegin(), str.cend(), e, -1);sregex_token_iterator end;/*Matched: aMatched: bbMatched: cd*/for (; pos!end; pos) {cout Matched: *pos endl;}
}
正则表达式还有一个常用的场景——字符串替换。C 中我们可以使用 regex_replaceint main() {string str(abc.com, def.com, aabb.com);regex e(([[:w:]])([[:w:]].com));cout regex_replace(str, e, $1 is on $2);
}
输出为a is on bc.com, d is on ef.com, aa is on bb.com本文主要翻译自 Bo Qian 的 YouTube 视频C 11 Library: Regular Expression 1youtu.beC 11 Library: Regular Expression 2 -- Submatchyoutu.beC 11 Library: Regular Expression 3 -- Iteratorsyoutu.be