c++11中regex正则表达式示例简述

所属分类: 软件编程 / C 语言 阅读数: 44
收藏 0 赞 0 分享

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

  • 以std::string为代表的处理字符串的类型(我们知道还有存储wchar_t的wstring类、原生c式字符串const char*等等,为了简化处理仅介绍std::string类型相关的操作,当你把握住了regex的主脉络之后,想使用其他的版本只要类比就可以)
  • std::regex类,该类型需要一个代表正则表达式的字符串和一个文法选项作为输入,当文法选项不提供时默认为ECMAScript。
  • std::match_results类,该类用来记录匹配的结果,这是一个模板类,该类的模板参数是一个迭代器类型,对于std::string来说我们定义了smatch作为match_results<string::const_iterator>作为别名。
  • 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 <iostream>
#include <string>
#include <regex>

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 <iostream>
#include <string>
#include <regex>

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 <iostream>
#include <string>
#include <regex>

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 <iostream>
#include <string>
#include <regex>

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模块的主要脉络,其余的关于对const char* 、wcahr_t类型的支持,以及regex_iterator、regex_token_iterator等迭代器的使用,以及掌控正则表达式行为方式的syntax_option_type的详细内容,等你需要去了解的时候去看官网的详解,相信学起来并不难。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

更多精彩内容其他人还在看

C语言非递归后序遍历二叉树

这篇文章主要为大家详细介绍了C语言非递归后序遍历二叉树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言单链表实现多项式相加

这篇文章主要为大家详细介绍了C语言单链表实现多项式相加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C语言二叉排序(搜索)树实例

这篇文章主要为大家详细介绍了C语言二叉排序树实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

NDK 数据结构之队列与栈等的实现

这篇文章主要介绍了NDK 数据结构之队列与栈等的实现的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
收藏 0 赞 0 分享

C/C++经典实例之模拟计算器示例代码

最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

C语言中的getchar和putchar的使用方法

这篇文章主要介绍了C语言中的getchar和putchar的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

C++实现洗牌发牌排序功能的示例代码

本篇文章主要介绍了C++实现洗牌发牌排序功能的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C++计算图任意两点间的所有路径

这篇文章主要为大家详细介绍了C++求图任意两点间的所有路径 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

zlib库压缩和解压字符串STL string的实例详解

这篇文章主要介绍了zlib库压缩和解压字符串STL string的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

C/C++ 获取Windows系统的位数32位或64位的实现代码

这篇文章主要介绍了C/C++ 获取Windows系统的位数32位或64位的实现代码的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多