C++相关闲碎记录(16)

1、正则表达式

(1)regex的匹配和查找接口
#include <regex>
#include <iostream>
using namespace std;void out (bool b)
{cout << ( b ? "found" : "not found") << endl;
}int main()
{// find XML/HTML-tagged value (using default syntax):regex reg1("<.*>.*</.*>");bool found = regex_match ("<tag>value</tag>",   // datareg1);                // regular expressionout(found);// find XML/HTML-tagged value (tags before and after the value must match):regex reg2("<(.*)>.*</\\1>");found = regex_match ("<tag>value</tag>",        // datareg2);                     // regular expressionout(found);// find XML/HTML-tagged value (using grep syntax):regex reg3("<\\(.*\\)>.*</\\1>",regex_constants::grep);found = regex_match ("<tag>value</tag>",        // datareg3);                     // regular expressionout(found);// use C-string as regular expression (needs explicit cast to regex):found = regex_match ("<tag>value</tag>",        // dataregex("<(.*)>.*</\\1>"));  // regular expressionout(found);cout << endl;// regex_match() versus regex_search():found = regex_match ("XML tag: <tag>value</tag>", regex("<(.*)>.*</\\1>"));         // fails to matchout(found);found = regex_match ("XML tag: <tag>value</tag>", regex(".*<(.*)>.*</\\1>.*"));     // matchesout(found);found = regex_search ("XML tag: <tag>value</tag>", regex("<(.*)>.*</\\1>"));        // matchesout(found);found = regex_search ("XML tag: <tag>value</tag>", regex(".*<(.*)>.*</\\1>.*"));    // matchesout(found);
}
输出:
found
found
found
foundnot found
found
found
found

regex_match()检验是否整个字符序列匹配某个正则表达式。

regex_search()检验是否部分字符序列匹配某个正则表达式。

regex_match(data, regex(pattern))

总是等价于

regex_search(data, regex("(.|\n)*" + pattern + "(.|\n)*")),其中(.|\n)*指任何数量和任意字符,.意指换行之外的任意字符,|表示or。

(2)处理次表达式
#include <string>
#include <regex>
#include <iostream>
#include <iomanip>
using namespace std;int main()
{string data = "XML tag: <tag-name>the value</tag-name>.";cout << "data:             " << data << "\n\n";smatch m;  // for returned details of the matchbool found = regex_search (data,m, regex("<(.*)>(.*)</(\\1)>"));  //出现\1则是代表与第一个小括号中要匹配的内容相同。// print match details:cout << "m.empty():        " << boolalpha << m.empty() << endl;cout << "m.size():         " << m.size() << endl;if (found) {cout << "m.str():          " << m.str() << endl;cout << "m.length():       " << m.length() << endl;cout << "m.position():     " << m.position() << endl;cout << "m.prefix().str(): " << m.prefix().str() << endl;cout << "m.suffix().str(): " << m.suffix().str() << endl;cout << endl;// iterating over all matches (using the match index):for (int i=0; i<m.size(); ++i) {cout << "m[" << i << "].str():       " << m[i].str() << endl;cout << "m.str(" << i << "):         " << m.str(i) << endl;cout << "m.position(" << i << "):    " << m.position(i)<< endl;}cout << endl;// iterating over all matches (using iterators):cout << "matches:" << endl;for (auto pos = m.begin(); pos != m.end(); ++pos) {cout << " " << *pos << " ";cout << "(length: " << pos->length() << ")" << endl;}}
}
输出:
data:             XML tag: <tag-name>the value</tag-name>.m.empty():        false
m.size():         4
m.str():          <tag-name>the value</tag-name>
m.length():       30
m.position():     9
m.prefix().str(): XML tag:
m.suffix().str(): .m[0].str():       <tag-name>the value</tag-name>
m.str(0):         <tag-name>the value</tag-name>
m.position(0):    9
m[1].str():       tag-name
m.str(1):         tag-name
m.position(1):    10
m[2].str():       the value
m.str(2):         the value
m.position(2):    19
m[3].str():       tag-name
m.str(3):         tag-name
m.position(3):    30matches:<tag-name>the value</tag-name> (length: 30)tag-name (length: 8)the value (length: 9)tag-name (length: 8)

smatch:针对“匹配string”而设计

cmatch:针对“匹配C-string(const char*)”而设计

wsmatch:针对“匹配wstring”而设计

wcmatch:针对“匹配wide C-string(const wchar_t*)”而设计

出现\1则是代表与第一个小括号中要匹配的内容相同。注意:\1必须与小括号配合使用

 (3)regex iterator
#include <string>
#include <regex>
#include <iostream>
#include <algorithm>
using namespace std;int main()
{string data = "<person>\n"" <first>Nico</first>\n"" <last>Josuttis</last>\n""</person>\n";regex reg("<(.*)>(.*)</(\\1)>");// iterate over all matches (using a regex_iterator):sregex_iterator pos(data.cbegin(),data.cend(),reg);sregex_iterator end;for ( ; pos!=end ; ++pos ) {cout << "match:  " << pos->str() << endl;cout << " tag:   " << pos->str(1) << endl;cout << " value: " << pos->str(2) << endl;}// use a regex_iterator to process each matched substring as element in an algorithm:sregex_iterator beg(data.cbegin(),data.cend(),reg);for_each (beg,end,[](const smatch& m) {cout << "match:  " << m.str() << endl;cout << " tag:   " << m.str(1) << endl;cout << " value: " << m.str(2) << endl;});
}
输出:
match:  <first>Nico</first>tag:   firstvalue: Nico
match:  <last>Josuttis</last>tag:   lastvalue: Josuttis
match:  <first>Nico</first>tag:   firstvalue: Nico
match:  <last>Josuttis</last>tag:   lastvalue: Josuttis
(4)regex token iterator
#include <string>
#include <regex>
#include <iostream>
#include <algorithm>
using namespace std;int main()
{string data = "<person>\n"" <first>Nico</first>\n"" <last>Josuttis</last>\n""</person>\n";regex reg("<(.*)>(.*)</(\\1)>");// iterate over all matches (using a regex_token_iterator):sregex_token_iterator pos(data.cbegin(),data.cend(), // sequencereg,                       // token separator{0,2});      // 0: full match, 2: second substringsregex_token_iterator end;for ( ; pos!=end ; ++pos ) {cout << "match:  " << pos->str() << endl;}cout << endl;string names = "nico, jim, helmut, paul, tim, john paul, rita";regex sep("[ \t\n]*[,;.][ \t\n]*");  // separated by , ; or . and spacessregex_token_iterator p(names.cbegin(),names.cend(),  // sequencesep,                          // separator-1);        // -1: values between separatorssregex_token_iterator e;for ( ; p!=e ; ++p ) {cout << "name:  " << *p << endl;}
}
输出:
match:  <first>Nico</first>
match:  Nico
match:  <last>Josuttis</last>
match:  Josuttisname:  nico
name:  jim
name:  helmut
name:  paul
name:  tim
name:  john paul
name:  rita
(5)用于替换的正则表达式
#include <string>
#include <regex>
#include <iostream>
#include <iterator>using namespace std;int main() {string data = "<person>\n"" <first>Nico</first>\n"" <last>Josuttis</last>\n""</person>\n";regex reg("<(.*)>(.*)</(\\1)>");cout << regex_replace(data,reg,                               "<$1 value=\"$2\"/>") << endl;     //replacementcout << regex_replace(data,reg,"<\\1 value=\"\\2\"/>",regex_constants::format_sed) << endl;string res2;regex_replace(back_inserter(res2),data.begin(), data.end(),reg,"<$1 value=\"$2\"/>",regex_constants::format_no_copy | regex_constants::format_first_only);cout << res2 << endl;return 0;
}
输出:
<person><first value="Nico"/><last value="Josuttis"/>
</person><person><first value="Nico"/><last value="Josuttis"/>
</person><first value="Nico"/>

(6)regex flag
#include <string>
#include <regex>
#include <iostream>
using namespace std;int main()
{// case-insensitive find LaTeX index entriesstring pat1 = R"(\\.*index\{([^}]*)\})";       // first capture groupstring pat2 = R"(\\.*index\{(.*)\}\{(.*)\})";  // 2nd and 3rd capture groupregex pat (pat1+"\n"+pat2,regex_constants::egrep|regex_constants::icase);// initialize string with characters from standard input:string data((istreambuf_iterator<char>(cin)),istreambuf_iterator<char>());// search and print matching index entries:smatch m;auto pos = data.cbegin();auto end = data.cend();for ( ; regex_search (pos,end,m,pat); pos=m.suffix().first) {cout << "match: " << m.str() << endl;cout << "  val: " << m.str(1)+m.str(2) << endl;cout << "  see: " << m.str(3) << endl;}
}

 (7)regex 异常
#include <regex>
#include <string>template <typename T>
std::string regexCode (T code)
{switch (code) {case std::regex_constants::error_collate:return "error_collate: ""regex has invalid collating element name";case std::regex_constants::error_ctype:return "error_ctype: ""regex has invalid character class name";case std::regex_constants::error_escape:return "error_escape: ""regex has invalid escaped char. or trailing escape";case std::regex_constants::error_backref:return "error_backref: ""regex has invalid back reference";case std::regex_constants::error_brack:return "error_brack: ""regex has mismatched '[' and ']'";case std::regex_constants::error_paren:return "error_paren: ""regex has mismatched '(' and ')'";case std::regex_constants::error_brace:return "error_brace: ""regex has mismatched '{' and '}'";case std::regex_constants::error_badbrace:return "error_badbrace: ""regex has invalid range in {} expression";case std::regex_constants::error_range:return "error_range: ""regex has invalid character range, such as '[b-a]'";case std::regex_constants::error_space:return "error_space: ""insufficient memory to convert regex into finite state";case std::regex_constants::error_badrepeat:return "error_badrepeat: ""one of *?+{ not preceded by valid regex";case std::regex_constants::error_complexity:return "error_complexity: ""complexity of match against regex over pre-set level";case std::regex_constants::error_stack:return "error_stack: ""insufficient memory to determine regex match";}return "unknown/non-standard regex error code";
}
#include <regex>
#include <iostream>
#include "regexexception.hpp"
using namespace std;int main()
{try {// initialize regular expression with invalid syntax:regex pat ("\\\\.*index\\{([^}]*)\\}",regex_constants::grep|regex_constants::icase);//...}catch (const regex_error& e) {cerr << "regex_error: \n"<< " what(): " << e.what() << "\n"<< " code(): " << regexCode(e.code()) << endl;}
}
(8)regex ECMAScript文法

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/218670.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[笔记] wsl 下使用 qemu/grub 模拟系统启动(单分区)

背景 最近在学习操作系统&#xff0c;需要从零开始搭建系统&#xff0c;由于教程中给的虚拟机搭建的方式感觉还是过于重量级&#xff0c;因此研究了一下通过 qemu 模拟器&#xff0c;配合 grub 完成启动系统的搭建。 qemu 介绍 qemu 是一款十分优秀的系统模拟器&#xff0c;…

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

【Hadoop_06】MapReduce的概述与wc案例

1、MapReduce概述1.1 MapReduce定义1.2 MapReduce优点1.3 MapReduce缺点1.4 MapReduce核心思想1.5 MapReduce进程1.6 常用数据序列化类型1.7 源码与MapReduce编程规范 2、WordCount案例实操2.1 本地测试2.2 提交到集群测试 1、MapReduce概述 1.1 MapReduce定义 MapReduce是一…

HPM6750系列--第九篇 GPIO详解(基本操作)

一、目的 在之前的博文中我们主要介绍了不同系统不同开发编译调试环境的配置和操作&#xff08;命令行方式、Visual Studio Code、Segger Embedded Studio for RISC-V&#xff09;&#xff0c;以帮助大家准备好学习环境为目的&#xff0c;但是未涉及到芯片本身以及外设的讲解。…

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道&#xff1a;据相关人士报道&#xff0c;苹果希望在未来2到3年内每年在印度生产超过5000万部iphone&#xff0c;要是该计划得以实现&#xff0c;印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示&#xff1a;“此次iPhone15推出是苹果印度制造计划的一…

设计模式详解---策略模式

1. 策略模式简介 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在运行时根据不同的情境选择不同的算法或策略。该模式将算法封装成独立的类&#xff0c;使得它们可以相互替换&#xff0c;而且可以独立于客户端使用它们的方式。 1.1.…

m_map导入本地地形数据

m_map绘制地形图时&#xff0c;虽然自带有1的地形图以及从NOAA下载的1分的地形图&#xff08;详见&#xff1a;Matlab下地形图绘图包m_map安装与使用&#xff09;&#xff0c;但有时需要对地形图分辨率的要求更高&#xff0c;便无法满足。 此时&#xff0c;需要导入本地地形数…

二蛋赠书十一期:《TypeScript入门与区块链项目实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)

A - Three Threes 题目大意&#xff1a;给你一个整数n&#xff0c;将这个数n输出n次。 呃呃 B - Pentagon 题目大意&#xff1a;给你一个正五边形ABCDE&#xff0c;给你任意两条边&#xff0c;判断是否相等 主要问题要判断一下内边&#xff1a;AD&#xff0c;AC&#xff0c;…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT&#xff0c;分为四个 part&#xff1a;leader election、log、persistence、log compaction。 实验环境 OS&#xff1a;WSL-Ubuntu-18.04 golang&#xff1a;go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南

作者&#xff1a;运维有术 前言 知识点 定级&#xff1a;入门级了解清单 (manifest) 和制品 (artifact) 的概念掌握 manifest 清单的编写方法根据 manifest 清单制作 artifactKubeKey 离线集群配置文件编写KubeKey 离线部署 HarborKubeKey 离线部署 KubeSphere 和 K8sKubeKey…

C++初阶-list类的模拟实现

list类的模拟实现 一、基本框架1.1 节点类1.2 迭代器类1.3 list类 二、构造函数和析构函数2.1 构造函数2.2 析构函数 三、operator的重载和拷贝构造3.1 operator的重载3.2 拷贝构造 四、迭代器的实现4.1 迭代器类中的各种操作4.1 list类中的迭代器 五、list的增容和删除5.1 尾插…

javacv的视频截图功能

之前做了一个资源库的小项目&#xff0c;因为上传资源文件包含视频等附件&#xff0c;所以就需要时用到这个功能。通过对视频截图&#xff0c;然后作为封面缩略图&#xff0c;达到美观效果。 首先呢&#xff0c;需要准备相关的jar包&#xff0c;之前我用的是低版本的1.4.2&…

Tomcat-安装部署(源码包安装)

一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个WEB应用程序的托管平台…

基于Nexus搭建Maven私服基础入门

什么是Nexus&#xff1f;它有什么优势&#xff1f; 要了解为什么需要nexus的存在&#xff0c;我们不妨从以下几个问题来简单了解一下: 为什么需要搭建私服&#xff1f;如果没有私服会出现什么问题&#xff1f; 对于企业开发而言&#xff0c;如果没有私服&#xff0c;我们所有…

十九)Stable Diffusion使用教程:ai室内设计案例

今天我们聊聊如何通过SD进行室内设计装修。 方式一:controlnet的seg模型 基础起手式: 选择常用算法,抽卡: 抽到喜欢的图片之后,拖到controlnet里: 选择seg的ade20k预处理器,点击爆炸按钮,得到seg语义分割图,下载下来: 根据语义分割表里的颜色值,到PS里进行修改: 语…

SoloLinker第一次使用记录,解决新手拿到板子的无所适从

本文目录 一、简介二、进群获取资料2.1 需要下载资料2.2 SDK 包解压 三、SDK 编译3.1 依赖安装3.2 编译配置3.3 启动编译3.4 编译后的固件目录 四、固件烧录4.1 RV1106 驱动安装4.2 打开烧录工具4.3 进入boot 模式&#xff08;烧录模式&#xff09;4.4 烧录启动固件4.5 烧录升级…

大型网站架构演进过程

架构演进 大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户&#xff0c;问题就会变得很棘手。大型网站架构主要就是解决这类问题。 架构选型是根据当前业务需要来的&…

RRC下的NAS层

无线资源控制&#xff08;Radio Resource Control&#xff0c;RRC&#xff09;&#xff0c;又称为无线资源管理&#xff08;RRM&#xff09;或者无线资源分配&#xff08;RRA&#xff09;&#xff0c;是指通过一定的策略和手段进行无线资源管理、控制和调度&#xff0c;在满足服…

数据库 02-03 补充 SQL的子查询(where,from),子查询作为集合来比较some,exists,all(某一个,存在,所有)

子查询&#xff1a; where字句的子查询&#xff1a; 通常用in关键字&#xff1a; 举个例子&#xff1a; in关键字&#xff1a; not in 关键字&#xff1a; in 也可以用于枚举集合&#xff1a; where中可以用子查询来作为集合来筛选元祖。 some&#xff0c;all的运算符号…