c++ 正则表达式

news2025/7/19 9:00:30

文章目录

  • 正则表达式
    • 基本语句
    • regex_match
    • regex_search
    • regex_token_iterator
    • regex_replace
    • 示例
      • 匹配电话号码
      • 匹配QQ号码
      • 匹配IP地址

正则表达式

什么是正则表达式?
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

我们直接从例子入手,如果要规定输入账号,指定账号的长度在5位到11位之间,且不能输入字符等其他字符,只能输入数字,那么你要如何编写C++程序呢??

c++伪代码:

  1. 首先规定长度len,长度大于5位,小于11位,否则重新输入。
  2. 然后规定输入数字,如果输入了数字直接重新输入。

regex正则表达式:

void fun()
{
	regex rex{ R"(\d{5,11})" };
	string account;
	smatch sm;
	cout << "请输入账号:";
	while (getline(cin, account))
	{
		if (regex_match(account, sm, rex))
		{
			break;
		}
		cout << "请重新输入:";
	}
	cout << "你的账号是: " << account << endl;
}

怎么样,是不是感觉很高端? 利用正则表达式还可以写出更加高效的代码,我们在等会给大家演示!


基本语句

首先先让我们来初步认识正则表达式的基本语句
有一篇博客总结的不错,这里我引用以下这个博主所总结的:
正则表达式

字符描述
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 ‘\\' 匹配 "\" 而 "\(" 则匹配 "("。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n' 或 ‘\r' 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n' 或 ‘\r' 之前的位置。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 ‘o',但是能匹配 "food" 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 ‘o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 ‘o+'。'o{0,}' 则等价于 ‘o*'。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 ‘o?'。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 ‘o+' 将匹配所有 ‘o'。
.匹配除 "\n" 之外的任何单个字符。要匹配包括 ‘\n' 在内的任何字符,请使用象 ‘[.\n]‘ 的模式。
(pattern)匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘‘或‘'。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries' 更简略的表达式。
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, ‘Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]‘ 可以匹配 "plain" 中的 ‘a'。
[^xyz]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]‘ 可以匹配 "plain" 中的'p'。
[a-z]字符范围。匹配指定范围内的任意字符。例如,'[a-z]‘ 可以匹配 ‘a' 到 ‘z' 范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]‘ 可以匹配任何不在 ‘a' 到 ‘z' 范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b' 可以匹配"never" 中的 ‘er',但不能匹配 "verb" 中的 ‘er'。
\B匹配非单词边界。'er\B' 能匹配 "verb" 中的 ‘er',但不能匹配 "never" 中的 ‘er'。
\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c' 字符。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]‘。
\W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。
\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, ‘\x41′ 匹配 "A"。'\x041′ 则等价于 ‘\x04′ & "1"。正则表达式中可以使用 ASCII 编码。.
\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1′ 匹配两个连续的相同字符。
\n标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

regex_match

regex_match可以精准的匹配正则表达式与字符串。

接受参数:

s − 它是一个带有目标序列的字符串。
rgx − 它是要匹配的 basic_regex 对象。
flags − 用于控制 rgx 的匹配方式。
m − 它是 match_results 类型的对象。

返回值:
如果 rgx 与目标序列匹配,则返回 true。 否则为 false 。

  • .* : . 表示输入任意一个字符,* 表示输入任意多个,即在<>的范围内输入任意多个字符
regex myReg1{ "<.*>" };
bool ret1 = regex_match("<1234asd89>", myReg1);
assert(ret1);	//正确
  • 一个比较上一个较复杂的例子:第一个<>内输入任意多个字符,然后在外面在接受任意多个字符,之后在最后一个<>内指定输入一个数字(使用转义字符转换为\d)
regex myReg2{ "<.*>.*<(\\d)>" };
bool ret2 = regex_match("<woaini>abc<5>", myReg2);
assert(ret2);	//正确
  • regex_match的另一种版本:
cmatch m;	//一个接受匹配后字符串的类,存储匹配后的字符串
auto ret = regex_match("<woaini>666</xml>", m, regex{ "<(.*)>(.*)</(.*)>" });
if (ret)
{
	cout << m.str() << endl;
	cout << m.length() << endl;
	cout << m.position() << endl;
}

通过cmatch接受const char*类型的字符串,当然通过smatch也可以接受string类型的字符串。我们可以调用它所拥有的方法,比如得到这个字符串:str(),得到长度: length(),得到某个子匹配项在整个大的匹配项中所处的位置。

  • 三种方法得到匹配后的字符串:
for (int i = 0	; i < m.size(); i++)
{
	cout << m[i].str() << " " << m.str(i) << endl;
}
cout << " -----------------------" << endl;
for (auto it = m.begin(); it != m.end(); it++)
{
	cout << *it << endl;
}

在这里插入图片描述


regex_search

搜索:整个字符序列中,是否有部分(或整体)符合匹配模式。

他接受的参数和返回值与regex_match一致。

在s中我们的字符序列在尾部多了一个end,显然与对应的匹配模式不符合,但是search和match不同的是,它只要有部分包含,则就是成功,返回正确匹配的一部分序列。

注意:在字符串前面加 R 表示原生 字符串 ,是防止 转义,否则你就要使用两个 \ 来表示转义。

  • \d:表示接受一个数字。
  • {3}:表示接受3个数字,与前面合起来则表示:接受 3个数字。
  • [0-9]:表示接受任意一个数字,与 \d一个意思
  • * 表示接受任意多字符,则表示接受 任意多个数字。
void f3()
{
	//regex_search: 字符串s的格式 在regex中匹配一部分,则返回匹配的部分内容,不必完全匹配
	//string s{ "123456<ylh><qq>: <1173012900>654321" };
	string s{ "<ylh>666<1173012900>  end" };
	smatch sm;
	auto ret = regex_search(s, sm, regex{ R"(<(.*)>\d{3}<[0-9]*>)" });
	if (ret)
	{
		//cout << sm.str() << endl;
		for (auto& x : sm)
		{
			cout << x << endl;
		}
		cout << sm.prefix() << endl;	//返回前部分不匹配的
		cout << sm.suffix() << endl;	//返回后部分不匹配的
	}
}

smatch存储了匹配的部分字符序列,<ylh>666<1173012900>,因此可以得到其前缀:prefix(),得到其后缀:suffix() ,这里的前缀与后缀都是指相对于匹配的这一部分前面的不匹配部分和后面不匹配部分。

regex_token_iterator

使用分词迭代器给字符序列分组:

void f5()
{
	//模板类regex_token_iterator<>提供分词迭代器
	string s{ "1173012900@qq.com,123456789@vip666.com,656dawda@163.cmo" };
	regex rex{ "," };
	sregex_token_iterator pos{ s.begin(),s.end(),rex,-1 };
	decltype(pos) end;
	for (; pos != end; ++pos)
	{
		cout << pos->str() << endl;
	}
}

在这里插入图片描述

regex_replace

替换指定的字符

void f6()
{
	string s{ "he....llo. .w..orl...d" };
	regex rex{ "\\." };
	cout << regex_replace(s, rex, "");
}

在这里插入图片描述

示例

匹配电话号码

  • 电话号码的位数为 11位,第一位一定是1
  • 第一位:1
  • 后10位:\d{10} 或者 [0-9]{10} 都可以
  • ^ 表示序列的开始 $表示序列的结束
void exp1()
{
	string s;
	regex reg{ "^1[0-9]{10}$" };	// "^1\d{10}$"
	smatch sm;
	cout << "输入你的电话号码: ";
	while (getline(cin, s))
	{
		if (regex_match(s,sm, reg))
		{
			break;
		}
		cout << "输入格式错误,请重新输入:";
	}
	cout << "您的电话号码是: " << s << endl;
}

匹配QQ号码

QQ号码的位数可以是5位到11位:

  • 第一位:[1-9] 或者 \d
  • 后四位到后十位:[0-9]{4,10}
//匹配qq号码
void exp2()
{
	string s;
	regex reg{ "[1-9]\\d{4,10}" };	//5位或者11位 第一位不为0
	smatch sm;
	cout << "输入你的qq号码: ";
	while (getline(cin, s))
	{
		if (regex_match(s, sm, reg))
		{
			break;
		}
		cout << "输入格式错误,请重新输入:";
	}
	cout << "您的qq号码是: " << s << endl;
}

匹配IP地址

IP地址可以有四个数字部分和三个 . 部分如: 127.125.56.254

注意:它的每一位都是 0 - 255的数字,你可能以为 直接 \d{1,3} 输入三位不就好了?但是别忘了不能超过 255最大数字;你可能还会想通过 [0-5]{1,3}不就好了,但是你别忘了只是超过200之后不能超过255,没说小于200的不能超过255,因此,通过简单的表达式无法求出ip地址的匹配,我们可以通过下面的几种情况分类讨论:

  1. 第一组: 0 - 9
  2. 第二组: 10 - 99
  3. 第三组: 100 - 199
  4. 第四组: 200 - 249
  5. 第五组: 250 - 255
  • 通过或把每一种可能性连接起来,表示这五组只要有一组成立就可以,并且用()把这一个统一的括起来,表示ip地址的第一个数字部分:
([0-9]|[1-9][0-9]|1\\d{2}|2[0-4][0-9]|25[0-5])
  • 前三个数字部分后面都带一个点分隔符,直接重复三次,并且使用 ?: 来匹配各个组的统一模式
(?:(?:[0-9]|[1-9][0-9]|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}
  • 最后一个数字后面没有点,因此单独写一条:别忘了加上 ^与$
^(?:(?:[0-9]|[1-9][0-9]|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1\\d{2}|2[0-4][0-9]|25[0-5])$ 
//匹配ip地址
void exp3()
{
	string s;
	//忽略子匹配内容字符: ?:
	regex reg{ "^(?:(?:[0-9]|[1-9][0-9]|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1\\d{2}|2[0-4][0-9]|25[0-5])$" };
	smatch sm;
	cout << "输入你的ip号码: ";
	while (getline(cin, s))
	{
		if (regex_match(s, sm, reg))
		{
			break;
		}
		cout << "输入格式错误,请重新输入:";
	}
	cout << "您的ip号码是: " << s << endl;
}

在这里插入图片描述

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

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

相关文章

GENERALIZATION THROUGH MEMORIZATION: NEAREST NEIGHBOR LANGUAGE MODELS

Abatract 我们引入了kNN-LMs&#xff0c;它扩展了一个预先训练的神经语言模型&#xff08;LM&#xff09;&#xff0c;通过与k个最近邻&#xff08;kNN&#xff09;模型线性插值。最近邻是根据预先训练好的LM嵌入空间中的距离进行计算的&#xff0c;并可以从任何文本集合中提取…

45-命令行基础操作

45-命令行基础操作LInux命令行基础LInux命令基础知识Linux的Gul与CLI为什么使用Linux命令行Linux命令语法格式Linux命令分类LInux基础命令登录命令电源管理命令电源命令1: shutdown电源命令2: halt电源命令3: reboot文件管理命令Linux文件目录结构(1)Linux文件路径帮助命令目录…

Vue+Vite+TS

目录#、基础配置1、安装Node.js2、修改npm镜像源3、配置vscode一、创建项目二、Ref全家桶三、computed计算属性js中数组使用的高阶函数四、watch监听器#、基础配置 1、安装Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/download/ 安装成功&#xff0c;查看版本node …

vue create 创建项目的时候遇到使用nvm切换node后 提示‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

前景:我是用的是nvm切换的node版本&#xff0c;不是直接安装高级版本node,有nvm同样困惑的可以用以下方式解决问题&#xff0c;加油&#xff01;&#xff01;&#xff01; 报错: ‘vue’ 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方法: 1.检查node和npm nod…

libvirt 使用UEFI 设置 edk2-ovmf

一、ovmf 与 edk2 关系&#xff1a; 英特尔EFI开发工具包II (edk2)的子项目&#xff0c;所以在edk2 源码中也能找到 ovmf 部分&#xff0c;ovmf 使UEFI支持Ia32和X64虚拟机 二、OVMF_VARS.fd 与 OVMF_CODE.fd&#xff1a; 1、变量存储和固件的可执行文件&#xff1b; 2、OVMF_…

【数据结构与算法】单链表的增删查改(代码+图解)

目录 顺序表和链表的特点&#xff1a; 时间复杂度&#xff1a; 分析&#xff1a; 单链表结构体和数据类型&#xff1a; 开辟一个节点和存储数据&#xff1a; 打印 尾插 尾删 头插 头删&#xff1a; 查找单链表中的元素 在pos后插入x 在pos前插入x 删除pos后的一个…

【详细学习SpringBoot源码之自定义监听器实战演练-6(自定义监听器、自定义监听事件、指定监听事件)】

一.知识回顾 【0.SpringBoot专栏的相关文章都在这里哟&#xff0c;后续更多的文章内容可以点击查看】 【1.SpringBoot初识之Spring注解发展流程以及常用的Spring和SpringBoot注解】 【2.SpringBoot自动装配之SPI机制&SPI案例实操学习&SPI机制核心源码学习】 【3.详细学…

RabbitMQ - 交换机

文章目录1. Exchanges2. 临时队列3. 绑定 bindings4. Fanout exchange4.1 Fanout 介绍4.2 Fanout 实战5. Direct exchange5.1 Direct 介绍5.2 多重绑定5.3 Direct 实战6. Topics exchange6.1 Topic 的介绍6.2 Topic 匹配案例6.3 Topic 实战1. Exchanges RabbitMQ 消息传递模型…

Techsmith Camtasia Studio2023专业电脑屏幕录制工具

Techsmith Camtasia Studio2023电脑版版下载! 从今天开始&#xff0c;我们开始讲解短视频制作。一提到短视频制作&#xff0c;很多人可能首先想到的&#xff0c;是PR、绘声给影。的确&#xff0c;PR和绘声绘影功能非常强大&#xff0c;毕竟它们是影视制作的专业软件&#xff0…

【Spring Boot】Day01

文章目录一、Spring Boot的引入创建总结演示运行可能出现的错误二、使用idea创建Spring Boot创建运行http://localhost:8080/hello三、介绍配置文件介绍application.yml一、Spring Boot的引入 创建 总结 # 项目中集成spring和springmvc 1. 新建项目 2. 拷贝jar包(maven) &…

5G核心网技术基础自学系列 | SMF提供的服务

书籍来源&#xff1a;《5G核心网 赋能数字化时代》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G核心网技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 SMF提供两种服务&#xff0c; 即N…

图文详解Linux基础经典教程(06)——CentOS安装JDK

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 从本节教程开始&#xff0c;我们尝试在CentOS上搭建Java开发环境&#xff0c;即在CentOS中安装&#xff1a;JDK、Tomcat、MySQL等开发工具。 这些工具均可选用YUM或压…

225. 用队列实现栈、232. 用栈实现队列、622. 设计循环队列

LeetCode题解前言用队列实现栈用栈实现队列循环队列总结前言 这三道题都是比较经典的一道题&#xff0c;主要想要考察我们对于栈、队列的性质的应用&#xff0c;也是笔试题的常客&#xff01;&#xff01;&#xff01;接下来就让我们一起来手撕它&#xff01;&#xff01;&…

【C】程序环境和预处理

&#x1f648;个人主页&#xff1a;阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;你所看到的惊艳&#xff0c;都曾被平庸所历练。 本章重点&#xff1a; 程序的翻译环境程序的执行环境详解&#xff1a;C语言程序的编译链接…

next-key lock案例

1. 加锁规则 在默认的可重复读的隔离级别下&#xff0c;加锁规则可以总结为&#xff1a;两个原则&#xff0c;两个优化和一个bug。 原则1&#xff1a;加锁的基本单位是next-key lock。next-key lock是前开后闭的区间原则2&#xff1a;查询过程中访问到的对象才会加锁优化1&am…

计算机网络-数据交换技术

数据交换&#xff1a;实现在大规模网络核心上进行数据传输的技术基础。 常见的数据交换技术包括&#xff1a;电路交换、报文交换和分组交换。 一、电路交换 电路&#xff1a;通过中间交换结点为两台主机之间建立一条专用的通信线路。电路交换&#xff1a;是最早出现的一种交换…

这个神器,让我的 Python 代码运行速度快了100倍

Python 已经得到了全球程序员的喜爱&#xff0c;连续多期稳坐编程语言排行榜第一把交椅。但是还是遭到一些人的诟病&#xff0c;原因之一就是认为它运行缓慢。 要是有一款能够自动优化我们代码的神器该有多好啊&#xff01; 于是&#xff0c;大家都在想尽各种办法来提高 Pytho…

弘扬企业家精神!闪马智能创始人兼CEO彭垚再获殊荣

随着新业态、新活力涌现&#xff0c;诞生了一批又一批新的优秀企业家。11月8日&#xff0c;闪马智能创始人兼CEO彭垚荣膺胡润百富“2022青年产业领袖”。 自2016年起&#xff0c;彭垚连续创业&#xff0c;7年内成功培育并壮大了两家行业独角兽企业&#xff0c;2019年4月成立闪…

创龙AD+全志T3 ad_display 开发案例 (2)

上一篇&#xff1a;创龙AD全志T3 ad_display 开发案例(1) 前 言 本文主要介绍基于全志科技T3(ARM Cortex-A7)处理器的8/16通道AD采集开发案例&#xff0c;使用核芯互联CL1606/CL1616AD芯片&#xff0c;亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 …

OpenCV图像处理——图像梯度

总目录 图像处理总目录←点击这里 七、图像梯度 7.1、图像梯度-Sobel算子 原图 直接计算 不建议这么算 sobelxycv2.Sobel(img,cv2.CV_64F,1,1,ksize3) sobelxy cv2.convertScaleAbs(sobelxy) cv_show(sobelxy,sobelxy)分别计算——合并 当前位置的像素值等于sobel算…