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

 更新时间:2020年4月25日 17:24  点击:2234

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的详细内容,等你需要去了解的时候去看官网的详解,相信学起来并不难。

总结

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

[!--infotagslink--]

相关文章

  • PHP正则表达式取双引号内的内容

    取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • php 验证只能输入汉字、英语、数字的正则表达式

    正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • PHP正则表达式匹配验证提取网址URL实例总结

    网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
  • 正则表达式中两个反斜杠的匹配规则详解

    这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • JS中使用正则表达式g模式和非g模式的区别

    这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
  • C#正则表达式使用方法示例

    这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
  • 常用C#正则表达式汇总介绍

    c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
  • JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Idea使用正则表达式批量替换字符串的方法

    这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • js用正则表达式筛选年月日的实例方法

    在本篇文章里小编给大家整理的是一篇关于js用正则表达式筛选年月日的实例方法,对此有兴趣的朋友们可以学习下。...2021-01-04
  • javascript 手机号码正则表达式验证函数 <font color=red>原创</font>

    随着手机号码段的不断增加,以前网上的手机号码验证函数都不能那么完美的支持了,这里脚本之家编辑特为大家准备的一个简单的正则与手机验证的函数分析。...2021-05-07
  • layui 正则表达式验证使用实例详解

    layui的正则表达式是在form表单中完成的,这篇文章主要介绍了layui 正则表达式验证使用教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07