1. /*
  2. 正则表达式:一个指定的模式用来对文本中的字符串提供精确且灵活的匹配
  3. */
  4. #include <regex>
  5. using namespace std;
  6. int main() {
  7. string str;
  8. while (true) {
  9. cin >> str;
  10. //regex e("abc.", regex_constants::icase); // . 表示除了换行符之外任意字符
  11. //regex e("abc?"); // ? 0个或者1个前面的字符
  12. //regex e("abc*"); // * 0个或多个前面的字符
  13. //regex e("abc+"); // + 1个或多个前面的字符
  14. //regex e("ab[cd]*"); // [...] 方括号中任意字符
  15. //regex e("ab[^cd]*"); // [^...] 任意不在方括号中的字符
  16. //regex e("ab[cd]{3,5}");
  17. //regex e("abc|de[\]fg]"); // | 或者
  18. //regex e("(abc)de+\\1"); // \1 第1个子串
  19. //regex e("(ab)c(de+)\\2\\1");
  20. //regex e("[[:w:]]+@[[:w:]]+\.com"); // [[:w:]] :字母,数字,下划线
  21. //regex e("abc.$"); // $ 行尾
  22. regex e("^abc.+", regex_constants::grep); // ^ 行首,切换正则表达式语法
  23. //bool match = regex_match(str, e); //str和e精确匹配
  24. bool match = regex_search(str, e); //str中中包含e
  25. cout << (match? "Matched" : "Not matched") << endl << endl;
  26. }
  27. }
  28. /*
  29. 正则表达式语法:
  30. ECMAScript //C++默认
  31. basic
  32. extended
  33. awk
  34. grep
  35. egrep
  36. regex e("^abc.+", regex_constants::grep); // 切换语法
  37. */
  38. /*************** 处理子表达式 *****************/
  39. /*
  40. std::match_results<> 储存详细的匹配Store the detailed matches
  41. smatch string类型的详细的匹配Detailed match in string
  42. smatch m;
  43. m[0].str() 整个匹配的字符串 (同m.str(), m.str(0))
  44. m[1].str() 第1个子串(同m.str(1))
  45. m[2].str() 第2个子串
  46. m.prefix() 所有匹配字符串之前的部分
  47. m.suffix() 所有匹配字符串之后的部分
  48. */
  49. int main() {
  50. string str;
  51. while (true) {
  52. cin >> str;
  53. smatch m; // typedef std::match_results<string>
  54. regex e("([[:w:]]+)@([[:w:]]+)\.com");
  55. bool found = regex_search(str, m, e); //只返回第一个匹配
  56. cout << "m.size() " << m.size() << endl; //size()==子匹配个数+1
  57. for (int n = 0; n< m.size(); n++) {
  58. cout << "m[" << n << "]: str()=" << m[n].str() << endl;
  59. cout << "m[" << n << "]: str()=" << m.str(n) << endl;
  60. cout << "m[" << n << "]: str()=" << *(m.begin()+n) << endl;
  61. }
  62. cout << "m.prefix().str(): " << m.prefix().str() << endl;
  63. cout << "m.suffix().str(): " << m.suffix().str() << endl;
  64. }
  65. }
  66. // 多个匹配的情况
  67. /**************** Regex Iterator ******************/
  68. int main() {
  69. cout << "Hi" << endl;
  70. string str;
  71. while (true) {
  72. cin >> str;
  73. regex e("([[:w:]]+)@([[:w:]]+)\.com");
  74. sregex_iterator pos(str.cbegin(), str.cend(), e);
  75. sregex_iterator end; // 默认构造定义了past-the-end迭代器
  76. for (; pos!=end; pos++) {
  77. cout << "Matched: " << pos->str(0) << endl;
  78. cout << "user name: " << pos->str(1) << endl;
  79. cout << "Domain: " << pos->str(2) << endl;
  80. cout << endl;
  81. }
  82. cout << "=============================\n\n";
  83. }
  84. }
  85. /**************** Regex Token Iterator ******************/
  86. int main() {
  87. cout << "Hi" << endl;
  88. //string str = "Apple; Orange, {Cherry}; Blueberry";
  89. string str = "boq@yahoo.com, boqian@gmail.com; bo@hotmail.com";
  90. //regex e("[[:punct:]]+"); // 空格,数字,字母以外的可打印字符
  91. //regex e("[ [:punct:]]+");
  92. regex e("([[:w:]]+)@([[:w:]]+)\.com");
  93. sregex_token_iterator pos(str.cbegin(), str.cend(), e, 0); //最后一个参数指定打印匹配结果的哪一部分,0表达整个匹配字符串,1表示第1个子串,-1表示没有匹配的部分
  94. sregex_token_iterator end; // 默认构造定义了past-the-end迭代器
  95. for (; pos!=end; pos++) {
  96. cout << "Matched: " << *pos << endl;
  97. }
  98. cout << "=============================\n\n";
  99. cin >> str;
  100. }
  101. /**************** regex_replace ******************/
  102. // 将匹配的字符串部分替换
  103. int main() {
  104. cout << "Hi" << endl;
  105. string str = "boq@yahoo.com, boqian@gmail.com; bo@hotmail.com";
  106. regex e("([[:w:]]+)@([[:w:]]+)\.com");
  107. regex e("([[:w:]]+)@([[:w:]]+)\.com", regex_constants::grep|regex_constants::icase );
  108. //cout << regex_replace(str, e, "$1 is on $2");
  109. cout << regex_replace(str, e, "$1 is on $2", regex_constants::format_no_copy|regex_constants::format_first_only);//format_no_copy不匹配的字符部分不拷贝到新串,只匹配第一个
  110. cout << regex_replace(str, e, "$1 is on $2"); // $1表示第一个子串
  111. std::cin >> str;
  112. }

C++11--正则表达式<regex>的更多相关文章

  1. c++11 正则表达式基本使用

    c++ 11 正则表达式 常用的方法 regex_match regex_search regex_replace 等. regex_match 要求正则表达式必须与模式串完全匹配,例如: strin ...

  2. C++11 | 正则表达式(4)

    C++11还支持正则表达式里的子表达式(也叫分组),用sub_match这个类就行了. 举个简单的例子,比如有个字符串"/id:12345/ts:987697413/user:678254& ...

  3. (四)boost库之正则表达式regex

    (四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std ...

  4. 【正则表达式1】C++11正则表达式

    https://www.cnblogs.com/pukaifei/p/5546968.html [正则表达式1]C++11正则表达式   头文件 #include <regex> rege ...

  5. 请写出正则表达式(regex),取得下列黄色部分的字符串 TEL: 02-236-9655/9659 FAX:02-236-9654 (黄色部分即02-236-9655/9659 ) ( 测试面试题)

    请写出正则表达式(regex),取得下列黄色部分的字符串 TEL: 02-236-9655/9659 FAX:02-236-9654 答: package test1; import java.uti ...

  6. C#正则表达式Regex常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...

  7. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  8. C#正则表达式Regex类

    C#正则表达式Regex类的使用 C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间 ...

  9. boost 正则表达式 regex

    boost 正则表达式 regex   环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...

  10. python进阶11 正则表达式

    python进阶11 正则表达式 一.概念 #正则表达式主要解决什么问题? #1.判断一个字符串是否匹配给定的格式,判断用户提交的又想的格式是否正确 #2.从一个字符串中按指定格式提取信息,抓取页面中 ...

随机推荐

  1. linux shell 中文件编码查看及转换方法

    参考: http://edyfox.codecarver.org/html/vim_fileencodings_detection.html 一.查看文件编码.     在打开文件的时候输入:set ...

  2. Django中的session于cookie的用法

    1.cookies 1.django 中使用 cookies 1.设置cookies的值(将数据保存到客户端) 语法: 响应对象.set_cookie(key,value,expires) key:c ...

  3. 如何将备份的oracle数据库还原到指定用户下。

    上一文章 oracle11g数据库--创建表空间,创建用户,用户授权并指定表空间.我们已经建好了指定的新用户pdmis. 接下来我们需要将备份好的数据库,还原至新用户pdmis下. 想要还原,我们需要 ...

  4. 【BZOJ4817】【SDOI2017】树点染色

    不算学会lct...... 原题: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种 ...

  5. 【java编程】加载Resources配置文件的方法

    一.加载配置实现k-v //FILTER_PROPERTY_NAME=META-INF/abc.properties private void loadFilterConfig(Properties ...

  6. IntelliJ IDEA备忘

    IntelliJ IDEA生成get/set方法的快捷键 IntelliJ IDEA生成get/set有2种方式,alt+enter.alt+insert.下面分别介绍这2种方式快速生成get与set ...

  7. centos 7.0 lnmp成功安装过程(很乱)

    下载nginx [root@localhost src]# wget http://nginx.org/download/nginx-1.7.9.tar.gz --2015-01-24 12:55:2 ...

  8. linux kernel笔记

    文章目录 关于linux内核中的__attribute__关键字 Linux kernel启动参数 gdt / ldt PCB 关于linux内核中的__attribute__关键字 part I: ...

  9. Stateful Kubernetes Applications Made Easier: PSO and FlashBlade

    转自:https://medium.com/@joshua_robinson/stateful-kubernetes-applications-made-easier-pso-and-flashbla ...

  10. 01Hadoop简介

    Hadoop思想之源:Google 面对的数据和计算难题 ——大量的网页怎么存储 ——搜索算法 带给我们的关键技术和思想(Google三篇论文) ——GFS(hdfs) ——Map-Reduce —— ...