成都网站建设设计

将想法与焦点和您一起共享

c++11中如何使用regex正则表达式-创新互联

c++11中如何使用regex正则表达式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联-成都网站建设公司,专注网站设计、成都网站制作、网站营销推广,国际域名空间,网页空间,网站托管、服务器租用有关企业网站制作方案、改版、费用等问题,请联系创新互联

regex库中涉及到的主要类型有:

以std::string为代表的处理字符串的类型(我们知道还有存储wchar_t的wstring类、原生c式字符串const char*等等,为了简化处理仅介绍std::string类型相关的操作,当你把握住了regex的主脉络之后,想使用其他的版本只要类比就可以)  std::regex类,该类型需要一个代表正则表达式的字符串和一个文法选项作为输入,当文法选项不提供时默认为ECMAScript。  std::match_results类,该类用来记录匹配的结果,这是一个模板类,该类的模板参数是一个迭代器类型,对于std::string来说我们定义了smatch作为match_results作为别名。  std::sub_match类,该类其实封装了两个迭代器,第一个代表开始部分,第二个代表结束部分,就像你用两个下表索引去表达一个字符串的某一个子串一样。这个类就是通过这样的方式提供原字符串的某一个子串作为结果。实际上match_results中就封装了一些std::sub_match类型的对象。(为什么是一些而不是一个,因为一次匹配可能会产生多个结果返回,regex认为每个括号对构成一个子匹配项,regex匹配的结果可以显式每个子匹配项匹配到的内容。)  现在我们有了表达字符串的类,表达正则匹配的类,表达匹配结果的类,接下来regex提供三个匹配函数:

bool std::regex_match(...)bool std::regex_search(...)string std::regex_replace(...)//实际上返回类型是根据你输入的数据类型对应的basic_string类。

首先说明三个函数功能上的不同,std::regex_match是全文匹配,即它希望你输入的字符串要和正则表达式全部匹配,才认为匹配成功,否则匹配失败,而std::regex_search是在你输入的字符串中不断搜索符合正则表达式描述的子字符串,然后将第一个匹配到的子字符串返回。std::regex_replace是在std::regex_search的基础上更进一步,可以将匹配的子字符串替换为你提供的字符串。

看几个例子:

#include #include #include int main() { std::regex pattern("\\d{4}"); std::string content("hello_2018"); std::smatch result; if (std::regex_match(content, result, pattern)) { std::cout << result[0]; } system("pause"); return 0;}

匹配失败,什么都不会输出。

这里说明一下为什么输出的是result[0],其实result[0]返回的就是一个sub_match类型的对象。regex中认为正则表达式的每个括号对构成一个子匹配项,并认为整个字符串作为0号子匹配项,然后根据左括号出现的位置,从1号开始编号,因此返回的result[0]就是匹配整个正则表达式的字符串。

#include #include #include int main() { std::regex pattern("\\d{4}"); std::string content("hello_2018 by_2017"); std::smatch result; if (std::regex_search(content, result, pattern)) { std::cout << result[0]; } system("pause"); return 0;}

搜索到第一个符合正则表达式的子串,输出 2018。

#include #include #include int main() { std::regex pattern("\\d{4}"); std::string content("hello_2018 by_2017"); std::smatch result; auto begin = content.cbegin(); auto end = content.cend(); while (std::regex_search(begin, end, result, pattern)) { std::cout << result[0] << " "; begin = result[0].second; } system("pause"); return 0;}

用上述方式可以输出字符串中所有符合正则表达式匹配要求的字符串,输出 2018 2017。

#include #include #include int main() { std::regex pattern("\\d{4}"); std::string content("hello_2018 by_2017"); std::string result = std::regex_replace(content, pattern, "everyone"); std::cout << result; system("pause"); return 0;}

输出 hello_everyone by_everyone。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联网站建设公司,的支持。


标题名称:c++11中如何使用regex正则表达式-创新互联
浏览地址:http://chengdu.cdxwcx.cn/article/dghedo.html