《C++11》深入剖析正则表达式库:解锁文本处理的高效之道
在现代编程领域,文本处理是一项不可或缺的任务,而正则表达式无疑是这一领域的强大利器。C++11标准库的引入,为C++开发者带来了正则表达式库,极大地丰富了C++在文本处理方面的能力。本文将全方位、多角度地深入探讨C++11正则表达式库,从基本概念到高级应用,从理论到实践,助你彻底掌握这一高效工具。
一、正则表达式的基本概念与构成要素
正则表达式,英文名为Regular Expression,简称regex,是一种用于匹配字符串中字符组合的模式。它由普通字符(例如字母和数字)以及特殊字符(元字符)组成,这些元字符赋予了正则表达式强大的模式描述能力。
(一)元字符详解
元字符是正则表达式的核心组成部分,它们具有特殊的含义,用于定义复杂的匹配规则。以下是一些常见的元字符及其功能:
.
(点):匹配除换行符\n
之外的任何单个字符。例如,正则表达式a.b
可以匹配"acb"、“a2b”、"a*b"等,其中的.
可以是任意字符。*
(星号):表示前面的字符可以出现0次或多次。比如,a*
可以匹配""(空字符串)、“a”、"aa"等。+
(加号):表示前面的字符可以出现1次或多次。与*
不同,+
要求至少出现一次前面的字符。例如,a+
可以匹配"a"、“aa”,但不能匹配空字符串。?
(问号):表示前面的字符可以出现0次或1次,即前面的字符是可选的。如a?
可以匹配"“和"a”。[]
(方括号):用于定义一个字符类,匹配方括号内的任意一个字符。例如,[abc]
可以匹配"a"、“b"或"c”;[a-z]
可以匹配任意一个小写字母。()
(圆括号):用于分组,将多个字符组合成一个逻辑单元,常用于捕获匹配的子串或改变运算优先级。比如,(ab)+
可以匹配"ab"、"abab"等。{n,m}
(花括号):表示前面的字符可以出现n到m次。例如,a{2,4}
可以匹配"aa"、“aaa”、“aaaa”。^
(脱字符):在方括号内表示否定,匹配不在方括号内的任意字符;在正则表达式开头表示匹配字符串的开始。如[^abc]
可以匹配除"a"、“b”、"c"之外的任意字符;^hello
表示匹配以"hello"开头的字符串。$
(美元符号):表示匹配字符串的结尾。例如,world$
表示匹配以"world"结尾的字符串。|
(竖线):表示逻辑“或”关系,用于匹配多个表达式中的任意一个。比如,a|b
可以匹配"a"或"b"。
(二)转义序列
在正则表达式中,某些字符具有特殊含义,如上述元字符。当我们需要匹配这些特殊字符本身时,就需要使用转义序列。转义序列以反斜杠\
开头,后跟需要转义的字符。例如,要匹配一个实际的点字符.
,就需要写作\.
;要匹配一个星号*
,就需要写作\*
。
此外,正则表达式还提供了一些特殊的转义序列,用于匹配常见的字符类别:
\d
:匹配任意一个数字,等价于[0-9]
。\w
:匹配任意一个字母或数字或下划线,等价于[a-zA-Z0-9_]
。\s
:匹配任意一个空白字符,包括空格、制表符、换行符等。\D
:匹配任意一个非数字字符,等价于[^0-9]
。\W
:匹配任意一个非字母数字下划线字符,等价于[^a-zA-Z0-9_]
。\S
:匹配任意一个非空白字符。
二、正则表达式的优势与应用场景
正则表达式相较于传统的字符串匹配方法,具有诸多显著优势,使其在多种场景下大放异彩。
(一)正则表达式的优势
- 灵活性:正则表达式能够描述极其复杂的文本模式。无论是匹配简单的单词,还是复杂的电子邮件地址、URL、IP地址等格式,正则表达式都能轻松应对。例如,一个简单的正则表达式
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
就能准确匹配大多数电子邮件地址格式,而传统的字符串匹配方法则需要编写大量繁琐的代码来实现类似功能。 - 效率:C++11正则表达式库在内部进行了诸多优化,使得匹配操作的执行速度远超普通的字符串匹配算法。它采用了高效的搜索策略和数据结构,能够快速定位和匹配目标字符串,尤其在处理大规模文本数据时,性能优势更为明显。
- 可读性与可维护性:虽然正则表达式初看起来可能有些晦涩难懂,但一旦掌握其语法和规则,编写出的正则表达式代码往往比传统的字符串处理代码更加简洁、易读。一个精炼的正则表达式就能清晰地表达复杂的匹配逻辑,便于代码的维护和更新。而且,正则表达式在不同的编程语言和工具中具有高度的一致性,熟悉了C++中的正则表达式,就能很容易地将其应用到其他语言中,大大提高了开发效率。
(二)正则表达式的应用场景
- 数据验证:在用户输入数据或从外部系统接收数据时,正则表达式是验证数据格式的强大工具。例如,验证用户输入的手机号码是否符合特定国家或地区的格式,如中国的手机号码通常为11位数字,以
13
、14
、15
、17
、18
、19
开头,就可以使用正则表达式^1[3-9]\d{9}$
来进行验证;验证电子邮件地址的格式是否正确,确保其包含用户名、"@"符号、域名等必要部分,如前文提到的电子邮件地址正则表达式。 - 数据提取:从大量文本中提取有价值的信息是正则表达式的另一大强项。比如,在日志文件中提取错误代码、时间戳、用户操作等关键信息;从网页源代码中提取标题、链接、图片地址等元素。通过精心设计的正则表达式,可以快速准确地定位并提取出所需的数据,为进一步的数据分析和处理提供便利。
- 数据替换:在文本编辑和数据清洗过程中,正则表达式可以方便地替换字符串中的特定部分。例如,将文档中的所有"旧产品名称"替换为"新产品名称";将文本中的日期格式从"日/月/年"统一替换为"年-月-日";去除字符串中的多余空格、特殊符号等。利用正则表达式的替换功能,可以高效地完成复杂的文本替换任务,节省大量人工操作时间。
三、C++11正则表达式库的深入使用
C++11正则表达式库为开发者提供了一套完整的工具,用于定义、搜索、匹配和替换正则表达式。要使用该库,首先需要包含<regex>
头文件。接下来,我们将详细介绍库中的关键类和函数,并通过丰富的示例展示其使用方法。
(一)关键类与函数
std::regex
:这是定义正则表达式的类。通过将正则表达式字符串传递给std::regex
的构造函数,可以创建一个正则表达式对象。例如,std::regex e("\\d{3}-\\d{2}-\\d{4}");
定义了一个用于匹配美国社会安全号码(格式为123-45-6789
)的正则表达式。std::smatch
:用于存储匹配结果的类。它是一个匹配结果容器,可以存储正则表达式匹配到的子串以及捕获组等内容。在进行匹配操作时,将std::smatch
对象作为参数传递给相关函数,匹配成功后,就可以通过该对象获取详细的匹配信息。std::regex_search
:用于在字符串中搜索正则表达式匹配项的函数。它从给定的字符串开始,查找第一个与正则表达式匹配的子串,并将匹配结果存储在std::smatch
对象中。如果找到匹配项,函数返回true
;否则返回false
。例如,std::regex_search(s, m, e)
会在字符串s
中搜索与正则表达式e
匹配的内容,并将结果存储在m
中。std::regex_match
:与std::regex_search
类似,但它要求整个字符串必须与正则表达式匹配才算成功。如果整个字符串符合正则表达式定义的模式,函数返回true
;否则返回false
。这在需要验证字符串整体格式时非常有用,如验证一个字符串是否完全符合日期格式YYYY-MM-DD
。std::regex_replace
:用于在字符串中替换正则表达式匹配项的函数。它可以将匹配到的子串替换为指定的新字符串,并返回替换后的结果。例如,std::regex_replace(s, e, r)
会将字符串s
中所有与正则表达式e
匹配的部分替换为字符串r
。
(二)示例详解
1. 匹配电话号码
#include <iostream>
#include <regex>
#include <string>int main() {std::string s = "Hello, my phone number is 123-456-7890.";std::regex e("\\d{3}-\\d{3}-\\d{4}"); // 定义正则表达式,匹配格式为123-456-7890的电话号码std::smatch m; // 用于存储匹配结果if (std::regex_search(s, m, e)) {std::cout << "Match: " << m.str() << std::endl; // 输出匹配到的电话号码} else {std::cout << "No match" << std::endl;}return 0;
}
在这个示例中,我们定义了一个正则表达式\\d{3}-\\d{3}-\\d{4}
,用于匹配常见的电话号码格式,即三组数字,每组之间用短横线连接。通过std::regex_search
函数在字符串s
中搜索匹配项,如果找到匹配项,就将匹配结果存储在std::smatch
对象m
中,并输出匹配到的电话号码。
2. 提取电子邮件地址
#include <iostream>
#include <regex>
#include <string>int main() {std::string s = "My email is john.doe@example.com.";std::regex e("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b"); // 定义正则表达式,匹配电子邮件地址std::smatch m; // 用于存储匹配结果if (std::regex_search(s, m, e)) {std::cout << "Email: " << m.str() << std::endl; // 输出匹配到的电子邮件地址}return 0;
}
电子邮件地址的匹配相对复杂,需要考虑用户名部分的各种字符组合以及域名的结构。在这个正则表达式中,\\b
表示单词边界,确保电子邮件地址是一个独立的单词;[A-Za-z0-9._%+-]+
匹配用户名部分,允许出现字母、数字、点、下划线、百分号、加号和减号;@
是电子邮件地址的固定分隔符;[A-Za-z0-9.-]+
匹配域名部分,允许出现字母、数字、点和减号;\\.[A-Za-z]{2,}
匹配顶级域名,要求至少有两个字母。通过std::regex_search
函数,我们可以在字符串s
中提取出符合格式的电子邮件地址。
3. 替换字符串
#include <iostream>
#include <regex>
#include <string>int main() {std::string s = "Hello, Mr. John Doe.";std::regex e("Mr\\."); // 定义正则表达式,匹配"Mr."std::string r = "Mr"; // 替换后的字符串std::string result = std::regex_replace(s, e, r); // 替换操作std::cout << result << std::endl; // 输出替换后的结果 "Hello, Mr John Doe."return 0;
}
在这个示例中,我们使用std::regex_replace
函数将字符串s
中的所有"Mr.“替换为"Mr”。正则表达式"Mr\\."
中的\\.
用于匹配实际的点字符,因为点在正则表达式中是元字符,需要转义。替换后的结果存储在字符串result
中,并输出显示。
(三)高级应用技巧
1. 捕获组的使用
捕获组是正则表达式中一个非常强大的功能,它允许我们将匹配到的子串分组,并在后续操作中引用这些组。捕获组通过圆括号()
定义,在匹配结果中可以通过组的索引来访问对应的子串。
#include <iostream>
#include <regex>
#include <string>int main() {std::string s = "Hello, my name is John and my email is john.doe@example.com.";std::regex e("my name is ([A-Za-z]+) and my email is ([\\w.]+@[\\w.-]+\\.[A-Za-z]{2,})"); // 定义正则表达式,使用捕获组std::smatch m; // 用于存储匹配结果if (std::regex_search(s, m, e)) {std::cout << "Name: " << m[1].str() << std::endl; // 输出捕获组1的内容,即名字std::cout << "Email: " << m[2].str() << std::endl; // 输出捕获组2的内容,即电子邮件地址}return 0;
}
在这个示例中,正则表达式"my name is ([A-Za-z]+) and my email is ([\\w.]+@[\\w.-]+\\.[A-Za-z]{2,})"
中定义了两个捕获组。第一个捕获组([A-Za-z]+)
用于匹配名字,第二个捕获组([\\w.]+@[\\w.-]+\\.[A-Za-z]{2,})
用于匹配电子邮件地址。匹配成功后,可以通过std::smatch
对象m
的索引访问器m[1]
和m[2]
分别获取名字和电子邮件地址这两个捕获组的内容。
2. 非贪婪匹配
在默认情况下,正则表达式中的量词(如*
、+
、{n,}
等)都是贪婪的,它们会尽可能多地匹配字符。但在某些情况下,我们希望进行非贪婪匹配,即尽可能少地匹配字符。这可以通过在量词后面添加一个问号?
来实现。
#include <iostream>
#include <regex>
#include <string>int main() {std::string s = "<div>Hello, <span>world</span></div>";std::regex e("<.*?>"); // 定义正则表达式,使用非贪婪匹配std::smatch m; // 用于存储匹配结果while (std::regex_search(s, m, e)) {std::cout << "Match: " << m.str() << std::endl; // 输出匹配到的标签s = m.suffix().str(); // 更新字符串,继续查找下一个匹配项}return 0;
}
在这个示例中,正则表达式"<.*?>"
中的.*?
表示非贪婪匹配任意字符,尽可能少地匹配,直到遇到第一个闭合的尖括号>
。这样,我们可以匹配到字符串中的每个单独的HTML标签,而不是贪婪地匹配整个<div>
标签及其内部内容。
3. 条件替换
在使用std::regex_replace
进行替换操作时,除了可以指定一个固定的替换字符串外,还可以使用格式化字符串进行条件替换。格式化字符串中可以包含特殊标记,如$&
表示整个匹配的子串,$1
、$2
等表示捕获组的内容。
#include <iostream>
#include <regex>
#include <string>int main() {std::string s = "The price is $100.";std::regex e("\\$(\\d+)"); // 定义正则表达式,匹配价格std::string result = std::regex_replace(s, e, "Only $1 dollars"); // 条件替换std::cout << result << std::endl; // 输出 "Only 100 dollars"return 0;
}
在这个示例中,正则表达式"\\$(\\d+)"
匹配以美元符号开头后跟一个或多个数字的价格。在替换字符串"Only $1 dollars"
中,$1
表示第一个捕获组的内容,即价格数字。因此,替换后的结果是将原字符串中的价格部分替换为带有文字描述的格式。
四、性能优化与注意事项
虽然C++11正则表达式库功能强大,但在使用过程中也需要注意一些性能优化技巧和潜在的陷阱,以确保代码的高效运行和正确性。
(一)性能优化技巧
- 预编译正则表达式:如果需要多次使用同一个正则表达式进行匹配或替换操作,建议将正则表达式预编译为
std::regex
对象。预编译可以避免每次使用时都重新解析正则表达式字符串,从而提高性能。例如,std::regex e("\\d+");
可以被重复用于多个std::regex_search
或std::regex_replace
操作。 - 选择合适的匹配函数:根据实际需求选择
std::regex_search
或std::regex_match
。如果只需要在字符串中查找匹配项,而不需要整个字符串完全匹配,使用std::regex_search
更为高效;如果需要验证整个字符串的格式,确保其完全符合正则表达式定义的模式,应使用std::regex_match
。 - 避免过度使用捕获组:虽然捕获组功能强大,但过多的捕获组会增加匹配过程中的开销。如果不需要在后续操作中引用捕获组的内容,可以考虑使用非捕获组(在圆括号前加
?:
,如(?:...)
)来分组,这样可以提高匹配性能。 - 合理设计正则表达式:尽量避免使用过于复杂的正则表达式,尤其是包含大量嵌套量词和捕获组的表达式,这可能导致回溯过多,严重影响性能。在设计正则表达式时,应尽量使其简洁明了,能够准确描述所需的匹配模式,同时避免不必要的复杂性。
(二)注意事项
- 特殊字符处理:在正则表达式中,一些特殊字符(如
.
、*
、+
、?
、[]
、()
等)具有特殊含义。如果需要匹配这些特殊字符本身,必须使用反斜杠\
进行转义。例如,要匹配一个实际的点字符.
,需要写作\\.
;要匹配一个星号*
,需要写作\\*
。在C++字符串中,反斜杠本身也需要转义,因此在定义正则表达式字符串时,通常需要使用双反斜杠\\
来表示一个反斜杠。 - 字符编码问题:C++11正则表达式库默认使用UTF-8编码处理字符串。如果处理的文本数据采用其他编码(如GBK、UTF-16等),在使用正则表达式之前,可能需要先将文本转换为UTF-8编码,以确保匹配结果的准确性。此外,在处理多字节字符(如中文字符)时,要注意正则表达式中字符类(如
\\w
、\\s
等)的匹配行为可能与预期不同,因为这些字符类是基于ASCII字符定义的,对于非ASCII字符的支持可能有限。 - 匹配结果的边界问题:在使用
std::regex_search
进行匹配时,要注意匹配结果的边界。匹配成功后,std::smatch
对象中的prefix()
和suffix()
成员函数可以分别获取匹配项之前的前缀字符串和之后的后缀字符串。如果需要继续在剩余字符串中查找下一个匹配项,应使用suffix().str()
作为新的搜索起点,而不是简单地使用原始字符串的子串。 - 异常处理:在使用C++11正则表达式库时,可能会抛出异常,如
std::regex_error
。当正则表达式语法错误、匹配操作失败或其他异常情况发生时,应通过异常处理机制(如try-catch
块)捕获并处理这些异常,以确保程序的健壮性和稳定性。
五、总结与展望
C++11正则表达式库为C++开发者提供了一个强大、灵活且高效的文本处理工具。通过深入理解正则表达式的基本概念、优势、应用场景以及C++11库的使用方法,我们可以在实际编程中轻松应对各种复杂的文本匹配、提取和替换任务。无论是在数据验证、数据清洗、文本分析还是其他需要处理文本的领域,正则表达式都能发挥重要作用。
然而,正则表达式并非万能的。在面对一些极端复杂的文本处理需求时,如深度语义分析、自然语言处理等,可能需要借助更专业的工具和算法。但无论如何,掌握C++11正则表达式库无疑将为我们的编程工作增添一份强大的助力,使我们能够更加高效、优雅地解决文本处理相关的问题。在未来的学习和实践中,我们可以继续探索正则表达式的更多高级技巧和优化方法,不断提升自己在文本处理领域的专业能力,为开发出更优质、高效的软件系统奠定坚实基础。
相关文章:
《C++11》深入剖析正则表达式库:解锁文本处理的高效之道
在现代编程领域,文本处理是一项不可或缺的任务,而正则表达式无疑是这一领域的强大利器。C11标准库的引入,为C开发者带来了正则表达式库,极大地丰富了C在文本处理方面的能力。本文将全方位、多角度地深入探讨C11正则表达式库&#…...
Mongodb相关内容
Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载:https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一: 方式2: 方式3&#…...
United States of America三种表示
"United States of America", "United States", 和 "America" 都表示美国,但它们的使用场景和背景略有不同。以下是关于为什么这些名称可以合在一起表示美国的详细解释: 1. "United States of America" 全称&a…...
【Redis】Redis特性及其应用场景
目录 Redis特性 在内存中存储数据 可编程性 可扩展性 持久化 集群 高可用 补充特性 Redis的应用场景 数据库 缓存 会话存储 消息队列中间件 Redis特性 Redis是一个在内存中存储数据的中间件,用于作为数据库、数据缓存。Redis在分布式系统中有着较…...
Vue 使用blob下载文件,打开文件,文件是损毁的
文章目录 问题分析解决 问题 如图所示,在进行图片下载时下载的文件显示图片已被损 分析 代码如下: import axios from axios; async function downloadImage1(link, name) {try {const response await axios.get(link, {responseType: blob, // 设置响…...
Android 通过systrace如何快速找到app的刷新率
1. 如何抓取systrace: 方法一 andrdoid11以及以上的android版本都支持使用perfetto的方式抓取systrace,简单好用。 adb shell perfetto --buffer 512mb --time 10s --out /data/misc/perfetto-traces/perfetto_trace gfx input view wm am hal res dalv…...
vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习
前言 靶机:Raven-2,IP地址为192.168.10.9 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 文章所用靶机来自vulnhub,可通过官网下载,或者通过链接:https://pan.quark.cn/s/a65…...
【单片机开发 - STM32(H7)】启动流程、方式、烧录方式详解
如侵权,联系删,个人总结学习用 参考资料:(最末尾有我的原生笔记,那个格式规范点) 安富莱 ARM汇编伪指令详解-CSDN博客 【STM32】STM32内存映射以及启动过程(超详细过程)-CSDN博客…...
[手机Linux] ubuntu 错误解决
Ubuntu: 1,ttyname failed: Inappropriate ioctl for device 将 /root/.profile 文件中的 mesg n || true 改为如下内容。 vim /root/.profile tty -s && mesg n || true 2,Errors were encountered while processing: XXX XXXX sudo apt-get --purge remove xxx…...
springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境
先说一下想法,小公司开发项目,参考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注册中心,有多个模块(每个模块都是一个服务)。 想本地开发,…...
MyBatis-增删改查操作一些细节
目录 删除 新增 修改 查询 小结: 删除功能 需求:根据ID删除用户信息 SQL:delete from user where id 5; Mapper接口方法(注意这里不是实现类): /*** 根据id删除*/ Delete("delete from user wher…...
windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
1. 安装 WSL 和 Ubuntu 打开命令行,执行 WSL --install -d ubuntu若报错,则先执行 WSL --update2. 重启电脑 因安装了子系统,需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示,输入账号,密…...
【学习笔记】各种强化学习环境
0. 写在前面 0.1 强化学习综述/资料(更新中) 鹏程实验室: 中文报道:学术分享丨具身智能综述:鹏城实验室&中大调研近400篇文献,英文原文:Aligning Cyber Space with Physical World…...
统计有序矩阵中的负数
统计有序矩阵中的负数 描述 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]…...
【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
1.问题原因1 报错信息1: fatal: unable to access https://github.com/microsoft/xxx/: Failed to connect to github.com port 443: Timed out 报错信息2: fatal: unable to access https://github.com/xxx/xx/: OpenSSL SSL_read: Connection was …...
Android SystemUI——使用Dagger2加载组件(四)
SystemUI 是 Android 系统中的一个重要模块,负责绘制系统栏(如状态栏、导航栏)、锁屏、快捷设置等用户界面元素。由于其复杂性,良好的架构设计和依赖管理对于保持代码的可维护性和扩展性至关重要。这就是 Dagger2 在此发挥重要作用的地方。 一、Dagger2介绍 Dagger2 是一个…...
Lesson 109 A good idea
Lesson 109 A good idea 词汇 idea n. 主意,想法 复数:ideas 用法:口语:Good idea! 好主意! Big idea! 高见!好主意! Great idea! 好主意 Bad idea! 坏主…...
网络安全-RSA非对称加密算法、数字签名
数字签名非常普遍: 了解数字签名前先了解一下SHA-1摘要,RSA非对称加密算法。然后再了解数字签名。 SHA-1 SHA-1(secure hash Algorithm )是一种 数据加密算法。该算法的思想是接收一段明文,然后以一种不可逆的方式将…...
自动化办公|xlwings简介
xlwings 是一个开源的 Python 库,旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作,读取和写入数据,执行宏,甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…...
C#使用OpenTK绘制3D可拖动旋转图形三棱锥
接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...
【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操
文章目录 选择题(10道)理论题(5道)实操题(5道) 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第12章ospf路由协议】理论和实操 选择题(10道) 在OSPF协议中,…...
计算机网络 (34)可靠传输的工作原理
前言 计算机网络可靠传输的工作原理主要依赖于一系列协议和机制,以确保数据在传输过程中能够准确无误地到达目的地。 一、基本概念 可靠传输指的是数据链路层的发送端发送什么,在接收端就收到什么,即保证数据的完整性、正确性和顺序性。由于网…...
提高互联网Web安全性:避免越权漏洞的技术方案
目录 一、越权漏洞概述 二、常见的越权漏洞类型 三、越权漏洞的影响 四、越权漏洞的技术解决方案 一、越权漏洞概述 越权(Authorization Bypass)类漏洞是指在系统中,攻击者通过绕过身份验证或访问控制,获取本不应访问的资源或…...
c语言 --- 字符串
创建字符串 1. 使用字符数组创建字符串 #include <stdio.h>int main() {char str[20] "Hello, world!";str[0] h; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0; }解释: 数组大小 20 表…...
Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(3)
1.zip/unzip指令 语法: zip 压缩⽂件.zip ⽬录或⽂件 功能:将⽬录或⽂件压缩成zip格式 常⽤选项: -r:递归处理,将指定⽬录下的 所有⽂件和⼦⽬录⼀并处理 example: 1.事前准备 建立以下文件与目录: 2.压缩test 目…...
Java中网络编程的学习
目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址(Internet Protocol Address) 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤: 服务器程序…...
微服务的CAP定理与数据一致性抉择
分布式系统中的CAP定理,包括一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三个核心要素。 微服务是分布式系统的一种表现形式,以及用户对于系统是分…...
正则表达式 - 简介
正则表达式 - 简介 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,它允许我们按照特定的模式(pattern)来搜索、匹配、查找和替换文本。正则表达式广泛应用于各种编程语言和工具…...
MySQL:表的内外连接
目录 1.内连接 2.左外连接和右外连接 178. 分数排名 - 力扣(LeetCode) 1.内连接 内连接就是两张表做笛卡尔积,再加上一个筛选条件。 这两个sql语句是一样的。 2.左外连接和右外连接 左外连接就是左表必须是完全显示,即使筛选…...
65.在 Vue 3 中使用 OpenLayers 绘制带有箭头的线条
前言 在现代的前端开发中,地图已经成为许多项目的核心功能之一。OpenLayers 是一个强大的开源地图库,它提供了丰富的功能和高度的定制化支持。在本篇文章中,我将向大家展示如何在 Vue 3 中使用 OpenLayers 绘制带有箭头的线条。 我们将实现…...
关于编写测试用例的细枝末节
这里写目录标题 故障判别类-边界考虑示例1.0:若A>20.3且持续时间≥15ms时(判故周期为1000Hz),输出B为1,否则输出B为0。 故障判别类-不可恢复测试示例1.1:若A>20.3且持续时间≥15ms时…...
【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象
文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…...
(一)QSQLite3库简介
1、SQLite数据库 SQLite数据库,作为一个轻量级的关系型数据库管理系统,广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点,它为开发者提供了极大的便利。然而,正是由于其应用广泛,随着用户对于系统…...
新版 MacOS 无法从 /usr/local/lib 加载动态链接库的解决办法
自己编写的动态链接库在Unix规范下一般位于/usr/local/lib,在2023年及之前的MacOS版本中,直接将动态库安装到该位置即可在程序运行时加载,可是升级MacOS版本后,ld就报错。 错误现象 运行程序,报错 dyld[6376]: Libra…...
PanWeidb-使用BenchmarkSQL对磐维数据库进行压测
本文提供PanweiDb使用BenchmarkSQL进行性能测试的方法和测试数据报告。 BenchmarkSQL,一个JDBC基准测试工具,内嵌了TPC-C测试脚本,支持很多数据库,如PostgreSQL、Oracle和Mysql等。 TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业…...
git在本地创建新分支并将该分支推送到远程仓库
1. 创建本地分支 首先,创建并切换到一个新的本地分支: git checkout -b new-branch-name2. 推送本地分支到远程仓库 将新的本地分支推送到远程仓库,并在远程创建一个对应的新分支: git push origin new-branch-name3. 设置本地…...
Axure9笔记
快速入门 原型图种类 1.线框图 2.高保真图 3.简易需求文档(PRD) tips 按住shift可以等比缩放 旋转:ctrl按角角 矢量图素材: iconfont-阿里巴巴矢量图标库 复制svg图-->将svg图换为形状 截屏: Windows&…...
33_操作Redis分片集群
1.Redis分片集群读写 我们使用的redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看。 [root@localhost ~]# redis-cli --cluster help 1.连接上7001节点后,尝试存储一组num=100和a=10的数据,语句如下所示。 [root@node1 cluster]# redis-cli -a 123456…...
llama.cpp 模型可视化工具 GGUF Visualizer
llama.cpp 模型可视化工具 GGUF Visualizer 1. GGUF Visualizer for VS Code (gguf-viz)1.1. Features1.2. Extension Settings References GGUF Visualizer https://marketplace.visualstudio.com/items?itemNameAgainstEntropy.gguf-viz 1. GGUF Visualizer for VS Code (g…...
MAC AndroidStudio模拟器无网络
先确认PC端是正常访问网络的; 模拟器端修改Wifi设置:设置 - 网络和互联网 - WALN设置 按照上图修改; IP设置:从DHCP修改为静态,IP地址:10.0.2.16 ,网关:10.0.2.2 , DNS…...
如何添加合适的索引:MySql 数据库索引认知
写在前面 博文内容涉及 Mysql 数据库索引简单认知,包括SQL执行过程,数据库数据存储原理。如何通过索引加快数据查询原理简单介绍适合有一定SQL基础的开发运维小伙伴建立数据库索引认知,学会如何添加索引理解不足小伙伴帮忙指正 😃…...
深度学习中的学习率调度器(scheduler)分析并作图查看各方法差异
文章目录 1. 指数衰减调度器(Exponential Decay Scheduler)工作原理适用场景实现示例 2. 余弦退火调度器(Cosine Annealing Scheduler)工作原理适用场景实现示例 3. 步长衰减调度器(Step Decay Scheduler)工…...
测试人员面试需要掌握的内容
测试人员面试需要掌握的内容 1、在公司的测试流程是什么? 产品经理确认本次版本的需求,召开需求评审会,进行估时排期,需求和时间都确定之后,UI出设计图,开发人员进行开发,测试人员编写测试用例…...
【C++】函数(下)
1、函数的常见样式 常见的函数样式有四种: (1)无参数无返回值 (2)有参数无返回值 (3)无参数有返回值 (4)有参数有返回值 (1)无参数无返回值 示例…...
dockerfile实现lnmp
dockerfile实现lnmp 自定义镜像实现整个架构 (基础镜像centos7) nginx cd /opt mkdir nginx mysql php vim Dockerfile docker network create --subnet172.111.0.0/16 mynetwork #创建自定义网段 docker run -itd --name nginx -p 80:80 --cpu-quota 20000 -m 512m -v /op…...
C语言进阶-2指针(一)
目录 1. 字符指针1.1 一般用法:字符指针指向单字符1.2 第二种用法,字符串首地址给指针变量1.3 习题,下面代码的输出结果是什么?为什么? 2. 指针数组2.1实例—— 字符指针数组2.2实例——整形指针数组2.3 例子,识别下下…...
JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南
1、简述 在现代Web开发中,安全性尤为重要。为了确保用户的身份,JSON Web Token(JWT)作为一种轻量级且无状态的身份验证方案,广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…...
SpringBoot链接Kafka
一、SpringBoot生产者 (1)修改SpringBoot核心配置文件application.propeties, 添加生产者相关信息 # 连接 Kafka 集群 spring.kafka.bootstrap-servers192.168.134.47:9093# SASL_PLAINTEXT 和 SCRAM-SHA-512 认证配置 spring.kafka.properties.securi…...
《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以…...
APP推荐:全新TV端来了,8K原画电视版
▌ 软件介绍 B站都不陌生吧,一个能追番、学习、娱乐的多元平台,之前也分享过几款第三方TV端,其中的BV最近更新了全新版本。 使用了全新的UI界面,由之前的顶部菜单栏改成了侧边布局,已解锁限制&…...