Cpp之旅(学习笔记)第10章 字符串和正则表达式

Cpp之旅(学习笔记)第10章 字符串和正则表达式

10.1 引言

  • Cpp标准库提供了 string 类型,使用程序员不必在使用C风格的文本处理方式——通过指针来处理字符数组。
  • Cpp标准库还提供了 string_view 类型,允许程序以容器方式访问字符序列( std::string 或者 char[] )。
  • 还提供了正则表达式匹配功能以查找文本中的模式。

10.2 字符串

string 是用于管理不同字符类型字符序列的 regular 类型。string 类型提供了很多有用的字符串处理操作:

例如:连接操作

string compose(const string& name, const string& domain) {return name + '@' + domain;
}
auto addr = compose("dmr", "bell-labs.com");
// 结果:dmr@bell-labs.com

函数 compose 中的字符串“加法”表示连接操作。

标准库 string 定义了一个移动构造函数,因此,即使是以传值方式而不是传引用方式返回一个很长的 string 也会很高效。

连接操作最常见的用法是在一个 string 的末尾追加一些内容。这可以直接通过 += 操作来实现。

void m2(string& s1, string& s2) {s1 = s1 + '\n';s2 += '\n';
}

除此之外,string 还支持下标操作(使用[])和提取子串操作。

string name = "Niels Stroustrup";
void m3() {string s = name.substr(6,10);	// s = "Stroustrup"name.replace(0,5,"nicholas");	// name 变成 "nicholas Stroustrup"name[0] = toupper(name[0]);		// name 变成 "Nicholas Stroustrup"
}

substr()操作返回 string ,保存其参数指定的子字符串的拷贝。

substr()参数:

  • 第一个参数是指向 string 中某个位置的下标。
  • 第二个参数是指出所需子串的长度。

replace()操作替换子串内容。在本例中,要替换的是从0开始、长度为5的子串,即Niels,它被替换为nicholas。最后将首字母变为大写。

注意:替换的内容和被替换的子串不必一样长。

如果你需要一个C风格的字符串(一个以0结尾的 char 数组),string 提供了对其包含的 C 风格字符串进行只读访问的接口

void print(const string& s) {// s.c_str()返回一个指向s所拥有的字符的指针printf("For people who like printf: %s\n",s.c_str());cout << "For people who like streams: " << s << '\n';
}

根据定义,字符串字面量的类型是 const char *。

要想获得 std::string 类型的字面量可以加上 s 后缀。

要想使用s后缀,需要使用命名空间 `std::literals::string_literals。

例如:

auto cat = "Cat"s;		// std::string类型
auto dog = "Dog";		// 一个C风格字符串:const char* 类型

10.3 字符串视图

字符串视图(string_view)本质上就是一个(指针,长度)对,表明了一个字符串序列。

string_view 类型可以作为一个范围定义,因此可以用它来遍历字符。

void print_lower(string_view sv1)
{for(char ch : sv1)cout << tolower(ch);
}

string_view 类型的显著限制就在于它是只读的。

例如,如果函数需要将参数内容修改为小写。就不能使用 string_view 来传递字符串。这种情况下,需要考虑使用 span

string_view bad(){string s = "Once upon a time";return {&s[5],4};				// 糟糕,返回了局部数据的指针
}

10.4 正则表达式

标准库定义了 std::regex 类及其支持的函数,提供对正则表达式的支持。

regex pat {R"(\w{2}\s*\d{5}(-\d{4})?)"};	// 美国邮政编码模式:XXddddd-dddd// 以及其他变种

它指定了一个以两个字母开始的模式 \w{2},后面是任意个空白符 \s*,在接下来是五个数字 \d{5},然后是可选的一个破折号和四个数字 -\d{4}。

书中使用了原始字符串字面量,它以 R”( 开始,以 )“ 结束。

原始字符串字面量的好处是可以直接包含反斜线和引号而无需转义,因此非常适合表示正则表达式。

正则表达式常常包含大量反斜线,如果使用常规字符串,模式定义如下:

regex pat {"\\w{2}\\s*\\d{5}(-\\d{4})?"};

<regex>中,标准库为正则表达式提供了如下支持:

  • regex_match():将正则表达式与一个(已知长度的)字符串进行匹配。
  • regex_search():在一个(任意长的)数据流中搜索与正则表达式匹配的字符串。
  • regex_replace():在一个(任意长的)数据流中搜索与正则表达式匹配的字符串并将其替换。
  • regex_iterator:遍历匹配结果和子匹配。
  • regex_token_iterator:遍历未匹配部分。

10.5 正则表达式的符号表示

正则表达式的特殊字符正则表达式的特殊字符
. 任意单个字符(”通配符“)\ 下一个字符有特殊意义
[ 字符集开始* 零或多次重复(后缀操作符)
] 字符集结束+ 一次或多次重复(后缀操作符)
{ 指定重复次数开始? 可选零或一次(后缀操作符)
} 指定重复次数结束| 二选一(或)
( 分组开始^ 行开始;非
( 分组结束$ 行结束

10.6 建议

  1. 使用 std::string 来保护字符序列;
  2. 优先选择 string 操作而不是C风格的字符串函数;
  3. 使用 string 声明变量和成员,而不要将它作为基类;
  4. 返回 string 应采用传值方式(依赖移动语义和拷贝消除);
  5. 直接或间接使用 substr() 读子字符串,使用 replace() 写子字符串;
  6. string 在需要的时候会自动扩展或收缩;
  7. 当需要范围检测时,应使用 at() 而不是迭代器或 [];
  8. 当需要优化性能时,应使用迭代器或 [] ,而不是 at();
  9. 只有迫不得已时,才使用 c_str() 或 data() 获得 string 的 C 风格字符串表示;
  10. 使用 stringstream 或通过的值提取函数(如 to<x>)将字符串转换为数值;
  11. 可用 basic_string 构造任意类型字符组成的字符串;
  12. 字符串加上 s 后缀用来表示标准库 string;

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

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

相关文章

【代码】基于算术优化算法(AOA)优化参数的随机森林(RF)六分类机器学习预测算法/matlab代码

代码名称&#xff1a;基于算术优化算法&#xff08;AOA&#xff09;优化参数的随机森林&#xff08;RF&#xff09;六分类机器学习预测算法/matlab代码 使用算术优化算法&#xff08;AOA&#xff09;优化分类预测模型的参数&#xff0c;收敛性好&#xff0c;准确率提升明显&am…

数据结构番外—大根堆

文章目录 大根堆 大根堆 这一篇中我会给出一个基于C模板实现的比较完善的heap类&#xff0c;你只需要简单地修改就可以把它变为小根堆 #include <iostream> #include <vector> #include <cmath> using namespace std;template<typename T> class heap…

java第二十五课

Mysql 数据库 设计: 表设计成功 alter table 改表的主键&#xff0c;改约束关系 表&#xff1a;关系表&#xff0c;改一个表&#xff0c;另外一个表 表---->java 代码 增删改查&#xff08;项目中需要的操作&#xff09; 项目:Create databaseCreate table&#xff08;从测试…

每天免费使用ChatGPT网站

我现在开发都是用chatgpt帮我做事情了&#xff0c;工作效率直接翻了好几倍&#xff0c;剩余时间来摸鱼&#xff0c;嘎嘎香~ 1、 ChatGPT 注册送ChatGPT3.5 4.0,每天也能免费使用&#xff0c;赶紧薅 2、 csdn的C知道 csdn新功能 3、文心一言 国内百度大厂的模型 各有优缺…

leetcode27. 移除元素

题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

Python 流程控制

目录 程序流程 顺序结构 分支结构 单分支 双分支 多分支 if 嵌套 循环结构 while循环 for 循环 退出循环 循环与分支嵌套 附录 程序流程 程序是由语句构成&#xff0c;而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑…

深入理解VUE组件:父子组件详细说明及应用

文章目录 &#x1f342;引言&#x1f342;什么是父子组件&#x1f342;属性传递&#x1f341;父组件向子组件传递属性&#x1f33f;父组件代码示例&#x1f33f;子组件代码示例 &#x1f341;子组件向父组件传递属性&#x1f33f;子组件代码示例&#x1f33f;父组件代码示例 &a…

后端项目操作数据库增删改查-使用MyBatis配置实现数据操作

一、创建一个数据表对应的实体类 在src/main/java/包名/路径下新建pojo.entity文件夹&#xff0c;如com.luoyang.small.pojo.entity&#xff0c;并在该文件夹下新增实体类java文件&#xff1a;如相册Album.java 该实体类的属性应与数据表的字段对应 数据表样例如下&#xff1a…

PTA 7-192 浪漫的表白

有一个帅小伙一直暗恋一个女孩&#xff0c;但他还是没有勇气向她表白“我爱你”&#xff0c;更别说“某某某&#xff0c;我爱你&#xff0c;如果非要在这份‘爱’上加一个期限的话&#xff0c;那就是一万年”这类肉麻的话&#xff0c;生怕说了后会是“落花有意流水无情”&#…

后端返回图片流前端展示图片

根据后端返回的图片流格式&#xff0c;选用合适方法转换 下面以base64为例 if(res.status 200) {res.data.data.forEach((item,index) > {let Array data:image/png;base64, itemlet blob this.base64toBlob(Array)let url URL.createObjectURL(blob)this.imageList.p…

24年5月软考高项考哪些内容,考试大纲什么的?

信息系统项目管理师属于「计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试」中的高级资格考试。 也称「软考高项」&#xff0c;可以「以考代评」用来评副高级职称。 一、软考备考前期准备 信息系统项目管理师考试科目包括&#xff1a; 《综合知识》、《案例分…

html原生echart柱状图

html原生echart柱状图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Bar Chart Example</title><!-- Include Chart.js library --><script src"https://cdn.jsdelivr.net/npm/…

Linux的基本指令(4)

目录 20.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 21.bc指令 22.uname –r指令&#xff1a; 23.重要的几个热键[Tab],[ctrl]-c, [ctrl]-d 20.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#…

手机上的记事本怎么打开?安卓手机通用的记事本APP

有不少上班族发现&#xff0c;自己想要在电脑上随手记录一些工作文字内容&#xff0c;直接使用电脑上的记事本工具来编辑文字是比较便捷的。但是如果想要在手机上记录文字内容&#xff0c;就找不到手机上的记事本了。那么手机上的记事本怎么打开&#xff1f;安卓手机通用的记事…

Windows环境 dockertopdesk 部署gitlab

1.在dockertopdesk里搜索 gitlab镜像 (pull)拉取镜像 2.运行镜像到容器 mkdir gitlab gitlab/etc gitlab/log gitlab/opt docker run -id -p 3000:80 -p 9922:22 -v /root/gitlab/etc:/etc/gitlab -v /root/gitlab/log:/var/log/gitlab -v /root/gitlab/opt:/var/opt/gitla…

2023-12-2 AIGC-chatgpt4-功能-记录

摘要: 2023-12-2 AIGC-chatgpt4-功能-记录 英文: ChatGPT-4, as an evolution of OpenAIs language models, has a wide range of capabilities: Language Understanding and Generation: It can understand and generate human-like text, making it useful for conversation…

百度智能云文字识别使用问题解决合集

1.创建试用程序时需要16位的签名MD5 解决方法&#xff1a;使用Java8 201版本及以下的jdk创建签名 下载地址&#xff1a;http://www.codebaoku.com/jdk/jdk-oracle-jdk1-8.html#jdk8u201 生成签名代码&#xff1a;keytool -genkeypair -v -keystore D:\key.jks -storetype PKC…

LeetCode130. Surrounded Regions

文章目录 一、题目二、题解 一、题目 Given an m x n matrix board containing ‘X’ and ‘O’, capture all regions that are 4-directionally surrounded by ‘X’. A region is captured by flipping all O’s into X’s in that surrounded region. Example 1: Input…

EasyExcel两行表头

例子&#xff1a; 代码&#xff1a; StorageService localStorageService storageFactory.getLocalStorageService();String path "";// 文件信息String dateTime DateUtils.formatTimestampToString(new Date());String title "xxx统计";String fil…

MySQL之锁

MySQL之锁 锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制&#xff0c;MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性 MySQL锁可以按模式分类为&#xff1a;乐观锁与悲观锁。 按粒度分可以分为全局锁、表级锁…