当前位置: 首页 > news >正文

六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”

想象一下,你需要在一大堆文本(比如日志文件、配置文件、网页代码)里查找符合某种特定模式的字符串,而不是仅仅查找固定的单词。比如说:

  • 找出所有的电子邮件地址 📧。
  • 找到所有看起来像电话号码 📞 的数字串。
  • 提取所有以 Error: 开头的错误信息
  • 验证用户输入的密码是否符合复杂度要求(比如包含大小写字母和数字)。

这时候,普通的查找(比如 Ctrl+F)就有点力不从心了,而正则表达式(Regular Expression,常简写为 Regex 或 Regexp)就是解决这类问题的超级武器!🚀

简单说,正则表达式就是一套描述、匹配一系列字符串规则“模式语言” 它用一些特殊符号(我们称之为元字符)和普通字符组合起来,定义一个“模板”,然后用这个模板去文本里寻找所有符合模板样子的字符串。

1. 最简单的匹配:你说啥,我找啥 (字面量匹配)

最基本的正则表达式就是普通的字符串本身。如果你想找 hello 这个词,那么正则表达式就是 hello。它会精确匹配文本中出现的 hello

# 示例:在一个字符串中查找 "cat"
echo "My cat is black, your cat is white." | grep --color=always 'cat'
# 输出会高亮两个 "cat"

(我们常用 grep 命令来演示正则表达式的匹配,--color=always 能高亮匹配到的部分)
注意: 为了防止 Shell 对正则表达式中的特殊字符进行意外解释,通常强烈建议将正则表达式用单引号 '' 包起来。

2. 元字符:赋予表达式“魔力”的特殊符号 ✨

正则表达式的强大之处在于元字符 (Metacharacters)。这些字符不再代表它们本身,而是具有特殊的含义,用来表达更复杂的匹配规则。

以下是一些最常用、最重要的元字符:

. (点):匹配任意单个字符 (除了换行符)

一个点 . 可以代表任何一个字符(字母、数字、符号都行,但通常不包括换行 \n)。

# 示例:查找 "c.t" 会匹配 "cat", "cot", "c t", "c@t" 等
echo "cat cot c t c@t chart" | grep --color=always 'c.t'
# 会高亮 cat, cot, c t, c@t
* (星号):匹配前面的元素零次或多次 (>= 0 次)

星号 * 表示它紧挨着的前面那个字符或分组可以出现任意次数,包括零次

# 示例:查找 "go*gle" 会匹配 "ggle", "google", "goooogle" 等
echo "ggle google goooogle gogle" | grep --color=always 'go*gle'
# 会高亮 ggle, google, goooogle
# "gogle" 因为没有 o 也匹配 (o 出现 0 次)
+ (加号):匹配前面的元素一次或多次 (>= 1 次)

加号 + 和星号类似,但要求它前面那个元素至少出现一次

# 示例:查找 "go+gle" 会匹配 "google", "goooogle", 但不匹配 "ggle"
echo "ggle google goooogle gogle" | grep -E --color=always 'go+gle'
# 会高亮 google, goooogle
# 注意:+ 是扩展元字符,标准 grep 可能需要加 -E 选项

注意口味不同:+, ?, {} 等元字符在传统的 grep (基础正则表达式 - BRE) 中可能需要加反斜杠 \ 转义才能用 (写成 \+, \?, \{\})。而在使用 grep -E (扩展正则表达式 - ERE) 或其他现代正则引擎 (如 Perl 兼容正则 PCRE) 时,通常不需要转义。为了方便,我们后面的例子大多假设使用 ERE (grep -E)。

? (问号):匹配前面的元素零次或一次 (0 或 1 次)

问号 ? 表示它前面那个元素是可选的,可以出现,也可以不出现。

# 示例:查找 "colou?r" 会匹配 "color" 和 "colour"
echo "color colour counselor" | grep -E --color=always 'colou?r'
# 会高亮 color, colour
^ (尖角号):匹配行首

^ 放在正则表达式的开头,表示匹配必须从一行的开始位置算起。

# 示例:查找以 "start" 开头的行
echo -e "start of the line\nmiddle start end\nstart again" | grep -E --color=always '^start'
# 只会高亮第一行和第三行的 "start"
# echo -e 让换行符 \n 生效
$ (美元符):匹配行尾

$ 放在正则表达式的末尾,表示匹配必须一直到一行的结束位置

# 示例:查找以 "end" 结尾的行
echo -e "start of the line end\nmiddle end middle\nanother end" | grep -E --color=always 'end$'
# 只会高亮第一行和第三行的 "end"

组合使用 ^$ 可以匹配整行内容。比如 ^hello$ 只匹配包含且只包含 hello 的那一行。

[...] (方括号):匹配集合中的任意一个字符

方括号 [...] 定义了一个字符集合,它会匹配任何一个包含在方括号里的字符。

  • [abc] : 匹配 ‘a’ 或 ‘b’ 或 ‘c’ 中的一个
  • [0-9] : 匹配任意一个数字 (0 到 9)。
  • [a-z] : 匹配任意一个小写字母。
  • [A-Z] : 匹配任意一个大写字母。
  • [a-zA-Z0-9] : 匹配任意一个字母或数字。
# 示例:查找包含数字的 "log[0-9].txt"
echo "log1.txt logA.txt log-3.txt log55.txt" | grep -E --color=always 'log[0-9]\.txt'
# 会高亮 log1.txt, log3.txt (注意点 . 需要转义)
[^...] (方括号内^开头):匹配不在集合中的任意一个字符

如果在方括号里面开头使用 ^,它的意思就变成了“非”,表示匹配任何一个没有在后面列出的字符。

# 示例:查找不是数字的字符
echo "abc123def" | grep -oE --color=always '[^0-9]'
# -o 只显示匹配到的部分,会输出 a, b, c, d, e, f (每个占一行)
\ (反斜杠):转义或引用特殊字符

反斜杠 \ 是个非常重要的元字符。它的主要作用有两个:

  1. 转义元字符:有特殊含义的元字符(如 . * + ? ^ $ [ ] ( ) { } | \失去它们的特殊含义,变成匹配它们字面本身。比如,你想匹配真正的点 .,就要写成 \.;想匹配星号 *,就要写 \*
  2. 引用特殊字符序列: 有些反斜杠后面跟特定字母,代表一类预定义的字符集(这种用法在不同正则流派中支持程度不同):
    • \d : 匹配任意一个数字 (等价于 [0-9])。(Perl/PCRE 风格常见)
    • \w : 匹配任意一个单词字符 (字母、数字、下划线,等价于 [a-zA-Z0-9_])。(Perl/PCRE 风格常见)
    • \s : 匹配任意一个空白字符 (空格、制表符 \t、换行符 \n 等)。(Perl/PCRE 风格常见)
    • \D, \W, \S : 分别匹配数字、单词字符、空白字符。
    • 注意: POSIX 标准的 BRE/ERE 对 \d, \w, \s 支持不普遍,推荐用 [[:digit:]], [[:alnum:]_], [[:space:]] 代替以获得更好兼容性。但 \d, \w, \s 在很多现代工具和语言中更常用。
# 示例:匹配 IP 地址的简化模式 (只匹配数字和点)
echo "192.168.1.1 is an IP" | grep -E --color=always '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
# 注意点 . 被转义成了 \.

3. 控制次数:量词 (Quantifiers) {} * + ?

我们已经见过 *, +, ? 了,它们是量词的简写形式。更通用的量词是用花括号 {} 来精确指定前面那个元素需要出现的次数

  • {n} : 正好出现 n 次。
  • {n,} : 至少出现 n 次 (n 次或更多次)。
  • {n,m} : 出现次数在 n 到 m 次之间 (包含 n 和 m)。
# 示例:匹配 3 个数字
echo "123 4567 89" | grep -E --color=always '[0-9]{3}'
# 会高亮 123, 456# 示例:匹配至少 2 个字母
echo "a bb ccc dddd" | grep -E --color=always '[a-z]{2,}'
# 会高亮 bb, ccc, dddd# 示例:匹配 2 到 4 位的小写字母单词
echo "hi hello world regex" | grep -E --color=always '\b[a-z]{2,4}\b'
# \b 是单词边界,确保匹配的是完整单词。会高亮 hi, hell(o), worl(d), rege(x) (取决于引擎贪婪性)
# 这里为了简单,先不深入 \b 和贪婪/非贪婪

4. 分组与捕获 () 和 替换/反向引用

圆括号 () 在正则表达式里有两个主要作用:

  1. 分组 (Grouping):多个字符当作一个整体来看待,然后可以对这个整体应用量词 (*, +, ?, {})。
  2. 捕获 (Capturing): 默认情况下,圆括号会“记住” (捕获) 它所匹配到的那部分文本。这些被捕获的内容可以在后面被引用(称为反向引用,通常用 \1, \2 等表示第几个括号匹配的内容)或者在一些工具(如 sed、编程语言)中被提取出来
# 示例:分组应用量词,匹配 "ababab"
echo "ababab abcabc" | grep -E --color=always '(ab){3}'
# 会高亮 ababab# 示例:捕获和反向引用,查找连续重复的单词
echo "hello hello world world good bye" | grep -E --color=always '([a-z]+) \1'
# \1 引用了第一个括号 ([a-z]+) 匹配到的内容。会高亮 "hello hello" 和 "world world"

5. 二选一:或者 | (Alternation)

竖线 | 用来表示“或”的关系,可以匹配它左边的模式或者右边的模式。

# 示例:匹配 "cat" 或 "dog"
echo "I have a cat and a dog." | grep -E --color=always 'cat|dog'
# 会高亮 cat 和 dog# 示例:结合分组,匹配 "http" 或 "https"
echo "http:///ivancodes.com" | grep -E --color=always '(http|https)://'
# 会高亮 http:// 和 https://

6. 在哪里用正则表达式?🛠️

正则表达式几乎无处不在!

  • 命令行工具: grep (查找), sed (编辑), awk (处理文本), less/more (查看时搜索) 等都原生支持
  • 文本编辑器: 大多数现代编辑器 (VS Code, Sublime Text, Vim, Emacs 等) 都内置了强大的正则搜索和替换功能。
  • 编程语言: Python (re 模块), JavaScript (RegExp 对象), Java (java.util.regex), Perl (内置), PHP (preg_* 函数), Ruby, Go, C# … 几乎所有主流语言都有正则库。

7. 正则也分“流派”?(Flavors/方言)

需要注意的是,正则表达式并非完全统一的标准,存在一些不同的“方言”或“流派”,它们在支持的元字符和语法细节上可能略有差异:

  • POSIX BRE (Basic Regular Expressions): 基础正则。在一些老旧的 Unix 工具(如标准 grep, sed)中默认使用。很多元字符(如 +, ?, |, (), {})需要加反斜杠 \ 转义才能用。
  • POSIX ERE (Extended Regular Expressions): 扩展正则。像 grep -E, egrep, awk 中常用。它直接支持 +, ?, |, (), {} 这些元字符,不需要反斜杠转义,写起来更方便。
  • PCRE (Perl Compatible Regular Expressions): Perl 兼容正则。功能最强大 💪,支持更多高级特性(如非捕获分组 (?:...), 零宽断言 (?=...), (?!...) 等,以及 \d, \w, \s 等简写)。很多现代语言和工具(如 grep -P, Python, PHP, JavaScript)都采用或兼容 PCRE。

建议: 对于初学者,先掌握 ERE 的常用元字符通常足够应对大部分场景。了解存在不同流派有助于你在使用不同工具时理解为什么有时需要加 -E\


正则表达式练习题 🧠✍️

题目一:基本匹配与元字符
❓ 写一个正则表达式,匹配包含 colorcolour 这两个单词的行。

题目二:数字匹配
❓ 写一个正则表达式,匹配一个三位数的整数。

题目三:开头与结尾
❓ 写一个正则表达式,匹配以大写字母开头,并且以句号 . 结尾的整行。

题目四:字符集合
❓ 写一个正则表达式,匹配一个小写元音字母 (a, e, i, o, u)。

题目五:量词
❓ 写一个正则表达式,匹配一个由至少两个数字组成的字符串。

题目六:转义
❓ 如何写一个正则表达式来精确匹配字符串 "$HOME" (包含美元符号和双引号本身)?

题目七:分组与或
❓ 写一个正则表达式,匹配 apple.jpgapple.png

题目八:综合应用 (简单邮箱格式)
❓ 写一个非常简化的正则表达式,尝试匹配类似 user@example.com 格式的字符串(假设用户名和域名只包含字母、数字、下划线,并且域名只有两部分)。


参考答案 ✅💡

答案一:
可以使用 ? 量词和分组 (或直接 |):

colou?r

或者

color|colour

grep -E 中使用:grep -E --color=always 'colou?r'

答案二:
可以使用 {n} 量词:

[0-9]{3}

或者 POSIX 兼容写法:

[[:digit:]]{3}

grep -E 中使用:grep -E --color=always '[0-9]{3}' (这会匹配行内任何位置的三位数字)
如果要求整行就是三位数,需要加锚点:^\[0-9]{3}$

答案三:
使用锚点 ^, $ 和字符集:

^[A-Z].*\.$

解释:^ 行首,[A-Z] 一个大写字母,.* 任意数量的任意字符(除了换行),\. 转义后的点,$ 行尾。
grep -E 中使用:grep -E --color=always '^[A-Z].*\.$'

答案四:
使用字符集合 [...]

[aeiou]

grep -E 中使用:grep -E -o --color=always '[aeiou]' (-o 只显示匹配的元音)

答案五:
使用 {n,} 量词:

[0-9]{2,}

或者 POSIX 兼容:

[[:digit:]]{2,}

grep -E 中使用:grep -E --color=always '[0-9]{2,}'

答案六:
需要转义 $"。注意在 Shell 中,单引号 ' 内的反斜杠 \ 通常会失去转义作用,所以可能需要在引号外或使用双引号配合更多转义,但这取决于具体工具和 Shell 如何处理引号和反斜杠。如果目标是提供给 grep 等工具的正则模式字符串,通常这样写(在单引号内,让 grep 解释转义):

'"\$HOME"'

但在 Shell 命令行直接 echo 可能需要更多层转义,这里假设是给 grep 的模式:

# 注意:Shell 本身也会解释 $HOME,所以用单引号保护
echo 'This is "$HOME"' | grep --color=always '"\$HOME"'
# 需要精确匹配,确保 $ 被转义

答案七:
可以使用分组和 |

apple\.(jpg|png)

解释:apple 字面匹配,\. 匹配点,(jpg|png) 匹配 jpg 或者 png。
grep -E 中使用:grep -E --color=always 'apple\.(jpg|png)'

答案八:
这是一个非常简化的例子,真实的邮箱正则复杂得多!

[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+

解释:

  • [a-zA-Z0-9_]+: 匹配至少一个字母/数字/下划线 (用户名部分)
  • @: 匹配 @ 符号
  • [a-zA-Z0-9_]+: 匹配至少一个字母/数字/下划线 (域名主体)
  • \.: 匹配点
  • [a-zA-Z0-9_]+: 匹配至少一个字母/数字/下划线 (顶级域名部分)
    grep -E 中使用:grep -E --color=always '[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+'

正则表达式的世界非常广阔,这里只是入门的基础。多练习,多在实际场景中使用(比如配合 grep, sed),才能真正掌握它!💪

相关文章:

六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”

想象一下,你需要在一大堆文本(比如日志文件、配置文件、网页代码)里查找符合某种特定模式的字符串,而不是仅仅查找固定的单词。比如说: 找出所有的电子邮件地址 📧。找到所有看起来像电话号码 &#x1f4d…...

Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用

Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用 本篇摘要20. Streaming:流式传输的多媒体应用20.4 基于Groq的带自动语音检测功能的多模态Gradio应用20.4.1 组件及配置1.…...

力扣hot100 (除自身以外数组的乘积)

238. 除自身以外数组的乘积 中等 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除…...

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…...

RHCSA笔记2

RHCSA基础命令 (一)命令格式 (1)命令名【选项】【参数】 选项:决定命令执行的方式,通常有个-或--开头 参数:决定命令作用的目标(目录,文件,磁盘&#xff…...

JavaSE核心知识点01基础语法01-02(基本数据类型、运算符、运算符优先级)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点01基础语法01-02&#xff0…...

FOC算法开环控制基础

1. 为什么要有FOC算法 先看看从有刷电机到无刷电机的简单介绍,如下图1,通电螺线圈会产生磁场,这个磁场会产生N级和S级,然后这个电磁铁就可以吸引永磁体,S级吸引N级,N级吸引S级,通俗的来说&…...

进程间通信——管道

概念 进程间通信(Inter-Process Communication,简称 IPC)是指在不同进程之间进行数据交换和信息传递的机制。它的目的主要有4种: 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间…...

五一作业-day02

文章目录 1. 每日基操2. 模拟故障2.1 **remove regular empty file 是否删除普通文件(空的)?**2.2 **is a directory xxx是一个目录**2.3 **xxx not a directory 不是一个目录**2.4 Cant open file for writing2.5 **No write since last change** 3. 习题4. **进阶习题** 1. …...

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server:就是服务注册中心(可以是一个集群),对外暴露自己的地址。 提供者:启动后向Eureka注册自己信息(地址,服务名称等),并且定期进行服务续约 …...

Qt 显示QRegExp 和 QtXml 不存在问题

QRegExp 和 QtXml 问题 在Qt6 中 已被弃用; 1)QRegExp 已被弃用,改用 QRegularExpression Qt5 → Qt6 重大变更:QRegExp 被移到了 Qt5Compat 模块,默认不在 Qt6 核心模块中。 错误类型解决方法QRegExp 找不到改用 Q…...

开元类双端互动组件部署实战全流程教程(第4部分:后台配置系统与参数动态控制)

作者:曾经因为后台配置写错,导致全服进不去房的工程师 组件附带的后台管理系统为 PHP 编写,界面简洁但功能齐全。具备完整的模块划分与权限体系,支持动态参数下发、日志审计、行为数据统计等。 七、前端后台交互流程图与代码示例 …...

MySQL基础关键_008_DDL 和 DML(一)

目 录 一、DDL 1.创建表 (1)语法格式 (2)实例 2.查看建表语句 (1)语法格式 (2)实例 3.修改表名 (1)语法格式 (2)实例 4.新…...

基于SpringBoot + Vue 的火车票订票系统

包含: [1]源码✔ 数据库文件✔ [2]万字文档✔ [3]视频与图文配置教程✔ 功能描述: 本系统包含管理员、用户两个角色。 管理员:用户管理、新闻公告管理、车辆管理、车站及路线管理、留言建议管理、车次信息管理 用户:购票操作、查…...

飞致云开源社区月度动态报告(2025年4月)

自2023年6月起,中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...

解决跨域的4种方法

00_跨域的概念 浏览器只允许请问具有相同的协议&#xff0c;域名&#xff0c;端口&#xff0c;进行请求&#xff0c;有一个不同&#xff0c;就会拒绝。 01.前后端协商jsonp //jsonp//jsonp 是 json with padding 的缩写&#xff0c;是一种通过 <script> 标签的 src 属性…...

C# 方法(局部函数和参数)

本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部函数 正如刚刚所解释的&…...

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件&#xff08;如导航、弹窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持续状态。 ✅ …...

数据库原理——E-R图的极速省流理解 例题解析

前言 数据库一节没听&#xff0c;一个小时看书给我大致看懂了 E-R概念模型极速省流版 E-R图的重点&#xff1a; 关系图&#xff0c;三要素——实体、属性、联系 图形标识——矩形、椭圆形、菱形 1.实体和属性也可以放一个框矩形框 2.菱形两层边&#xff1a;弱实体集的联…...

5.4 - 5.5Web基础+c语言拓展功能函数

StringBoot HTTP协议&#xff1a; 规定了浏览器与服务器之间数据传递的规则。 请求协议&#xff1a; 请求数据格式&#xff1a; 请求头和请求体之间有一个空行隔开 响应协议&#xff1a; 响应数据格式&#xff1a; 响应头和响应体之间存在空行隔开。 响应数据设置&#xff1…...

Java抽象类与接口详解

一、抽象类(Abstract Class) 1. 定义与基本使用 // 抽象类定义 public abstract class Animal {// 抽象方法(无实现)public abstract void makeSound();// 具体方法(有实现)public void sleep() {System.out.println("动物在睡觉");} }// 继承抽象类 class Dog ext…...

网络延时 第四次CCF-CSP计算机软件能力认证

就是求树的直径: 思路&#xff1a;函数代表当前根节点的最长距离 然后遍历保存当前树的所有孩子的最长距离 和次长距离 如果是叶子节点就返回0 在每次获得每个节点的次长距离和最长距离就更新全局直径 最后获得最长距离 Ac代码: #include <bits/stdc.h> using namespa…...

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁&#xff0c;传父类调用父类&#xff0c;传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…...

网络传输中字节序

在小端字节序主机发送数据 0x1234 的情况下,(单字节没有字节序)我们可以分步骤来分析接收端如何解析这个数据: 1. 小端字节序主机的存储方式 在小端字节序中,低地址存储低字节,高地址存储高字节。 数据 0x1234 的字节表示为: 低字节:0x34 高字节:0x12 因此,在小端字…...

前端- ElementPlus入门

1.介绍 Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue3 的网站组件库&#xff0c;用于快速构建网页。 Element 提供了很多组件供我们使用。例如 超链接、按钮、图片、表格等等。 官方网站&#xff1a;一个 Vue 3 UI 框架 | Element Plus 2.步骤 1.安装E…...

AI Agent 要用到的技术

AI 发展是大趋势&#xff0c;以下是目前要用到的一些技术项 不论你从事哪个方向&#xff0c;这个技术栈都有必要学习 LangChainTransformersMicrosoft Semantic KernelLangflowLangGrphLangSmith 学习网站 以下是 LangChain、Transformers、Microsoft Semantic Kernel 的学习…...

# 从零构建一个简单的卷积神经网络:手写数字识别

从零构建一个简单的卷积神经网络&#xff1a;手写数字识别 在深度学习的世界里&#xff0c;卷积神经网络&#xff08;CNN&#xff09;是处理图像数据的强大工具。今天&#xff0c;我们将通过一个简单的例子&#xff0c;从零开始构建一个CNN模型&#xff0c;用于手写数字识别。…...

【RK3588嵌入式图形编程】-Cairo-Cairo图形库支持后端

Cairo图形库支持后端 文章目录 Cairo图形库支持后端1、PNG图像后端2、PDF文件后端3、SVG文件后端4、GTK窗口支持Cairo库支持多种后端。在本文中,我们使用Cairo创建PNG图像、PDF文件、SVG文件,并在GTK窗口上绘制。 1、PNG图像后端 在第一个示例中,我们创建一个 PNG 图像。 …...

LCD,LED

本文来源 &#xff1a; 腾讯元宝 LCD(Liquid Crystal Display)液晶显示器 LCD本身并不能发光&#xff0c;而是控制光的传输。 LCD内充满了棒状的液态分子&#xff08;液晶&#xff09;&#xff0c;这些分子可以形成扭转的螺旋线&#xff0c;弯曲来自显示器背后光源产生的光线或…...

HTML 元素

什么是 HTML 元素&#xff1f; HTML 元素&#xff08;Element&#xff09;是构成 HTML 文档的基本单位&#xff0c;它由开始标签、内容和结束标签组成&#xff0c;用于定义网页的结构和内容。元素是 HTML 标记语言的核心概念&#xff0c;每个元素都有特定的语义和用途。 元素…...

(undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)

url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html 任务0&#xff1a;讲义如下 (完成) mmap和munmap系统调用允许UNIX程序对其地址空间进行精细控制。它们可用于进程间共享内存、将文件映射到进程地址空间&#xff0c;并作为用户级页面错误处理方案的一部分&#x…...

7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测

7400MB/s&5050TBW完美结合&#xff0c;全新希捷酷玩530R SSD体验评测 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说到希捷酷玩530 SSD&#xff0c;很多硬核进阶玩家应该都知道&#xff0c;或者说正在使用&#xff08;比如说我~&#xff09;。 作为希捷大厂旗下高性能SSD的…...

【数据结构与算法】同余计算 哈希表与前缀和问题特征和模板化思路

加减乘负的类同余计算 加乘模情况 两数和模 : (a b) mod m (a mod m b mod m) mod m乘积模 : (a * b) mod m ((a mod m) * (b mod m)) mod m 加模证明如下 : a q1 * m r1 , b q2 * m r2则 a mod m r1 , b mod m r2(a b) mod m ((q1 q2) * m (r1 r2)) mod m …...

TS 交叉类型

很类似于接口继承啊 哈哈哈 使用type关键字声明交叉类型 // 声明交叉类型 type PersonDetail person & Contactlet theshy:PersonDetail { name:the shy,phone:马头 }交叉类型和接口实现对对象的类型注解的区别与联系 如果在接口继承时发生同名属性冲突会报不兼容的错…...

FreeRTOS学习系列·二值信号量

目录 1. 信号量的基本概念 2. 二值信号量 3. 应用场景 4. 运作机制 5. 信号量控制块 6. 常用信号量函数接口API 6.1 创建二值信号量 xSemaphoreCreateBinary() 6.2 信号量删除函数 vSemaphoreDelete() 6.3 信号量释放函数 6.3.1 xSemaphoreGive() 6.3.2 …...

二叉搜索树 AVL树 红黑树 的性质

二叉搜索树 如何判断一棵树是否是二叉搜索树&#xff1f; 1.方法一 左子树的所有节点值 < 当前节点值&#xff0c;右子树的所有节点值 > 当前节点值&#xff0c;左右子树也必须满足 。 2.方法二 中序遍历&#xff0c;得到的序列是有序的 红黑树 红黑树的性质 1.根…...

分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南&#xff0c;帮助开发者快速定位和清理冗余数据&#xff1a; 1. 查看 Docker 磁盘使用概览 docker system df 输出说明&#xff1a; TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …...

LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究

多轮对话策略:设计LLM提示词并优化多轮对话输出 LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究 摘要 本文针对大语言模型(LLM)在心理健康问题咨询对话场景中的应用,系统研究提示词设计方法及多轮对话优化策略。通过分析提示词核心原理,构建包含任务指…...

Kubernetes(k8s)学习笔记(七)--KubeSphere 最小化安装

前情提要 可视化操作面板对于开发、运维绝对是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可视化操作来管理Kubernetes。 可视化面板有多种&#xff1a; 1.Kubernetes官方提供的默认面板&#xff1a;dashboard&#xff0c;用处不大&#xff0c;放弃&#xff1b…...

面向对象与过程介绍

一、面向对象具体介绍 &#xff08;1&#xff09;基本概念 1.对象 在面向对象编程中&#xff0c;对象是对现实世界中事物的抽象&#xff0c;它具有状态&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;。在 TypeScript 中&#xff0c;我们可以通过类、接口等…...

UniGetUI 使用指南:轻松管理 Windows 软件(包括CUDA)

UniGetUI&#xff08;前身为 WingetUI&#xff09;是一款专门为 Windows 10&#xff08;x64&#xff09;和 Windows 11 系统打造的图形化包管理器界面工具。它集成了 Winget、Scoop、Chocolatey、Npm、Pip、Cargo、vcpkg、.NET Tool 和 PowerShell 等多种常用包管理器的功能&am…...

使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块

一、前言 在 Web 应用中&#xff0c;对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外&#xff0c;最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…...

014枚举之指针尺取——算法备赛

枚举是数据结构与算法中基本的操作&#xff0c;常用于解决序列的区间问题。算法界将"双指针"视为其重要分支&#xff0c;类似地当然还有"三指针"&#xff0c;“四指针”&#xff0c;最常见的还是“双指针”&#xff0c;我认为它们应统称为“指针尺取”。 双…...

Python小酷库系列:bidict,可以双向查询的dict

bidict&#xff0c;可以双向查询的dict 基本使用创建双向字典正向查找&#xff08;key → value&#xff09;反向查找&#xff08;value → key&#xff09;添加新项删除项 进阶功能使用 ~ &#xff08;.inverse&#xff09;获取逆映射使用 namedbidict 创建具名双向字典批量更…...

Android Compose 中 CompositionLocal 的全面解析与最佳实践

CompositionLocal 在 Android Compose 中的详细总结 核心概念 CompositionLocal 是 Jetpack Compose 提供的一种隐式数据传递机制&#xff0c;允许数据在组件树中向下传递&#xff0c;而无需显式地通过每个 Composable 函数的参数传递。 两种创建方式 1. staticComposition…...

Qt开发:容器组控件的介绍和使用

文章目录 一、Group Box&#xff08;分组框&#xff09;1.1 QGroupBox 简介1.2 基本用法1.3 设置为可勾选&#xff08;可启用/禁用子控件&#xff09;1.4 信号与槽连接&#xff08;监控勾选状态&#xff09;1.5 布局示例&#xff08;完整&#xff09; 二、Scroll Area&#xff…...

JS逆向入门案例1——集思录登录

JS逆向入门案例1——集思录登录 前言声明网站流程分析总结 前言 由于这段时间本职工作比较繁忙&#xff0c;没有很多空余的时间去研究各大厂的加密风控了&#xff0c;想起来自己刚接触js逆向走过坎坷&#xff0c;所以决定出一期js入门案例分析&#xff0c;为刚接触js逆向的小伙…...

ARM子程序和栈

微处理器中的栈由栈指针指向存储器中的栈顶来实现&#xff0c;当数据项入栈时&#xff0c;栈 指针向上移动&#xff0c;当数据项出栈时&#xff0c;栈指针向下移动。 实现栈时需要做出两个决定&#xff1a;一是当数据项进栈时是向低位地址方向向上生 长&#xff08;图a和图b&a…...

笔试专题(十五)

文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的&#xff0c;所以i n-1时ret 3. 把水平的位置和上升部分&#xff0c;水平位置和下降部分分为一个排列子序列 代…...

使用OpenCV 和 Dlib 进行卷积神经网络人脸检测

文章目录 引言1.准备工作2.代码解析2.1 导入必要的库2.2 加载CNN人脸检测模型2.3 加载并预处理图像2.4 进行人脸检测2.5 绘制检测结果2.6 显示结果 3.完整代码4.性能考虑5.总结 引言 人脸检测是计算机视觉中最基础也最重要的任务之一。今天我将分享如何使用dlib库中的CNN人脸检…...