️ 正则钥匙:开启高效编程之门

news2024/9/8 23:34:01

前言

📚 日常开发过程中,有哪些地方用到了正则?
🔍 你是否经常根据需求在网上搜索正则表达式,拷贝后发现不适用,然后不得不重复搜索?
🚀 协作开发的过程中,碰到别人写的正则,你是不是看的一头雾水,不知道他写的是什么意思?
🎯 别担心,本文将带你从零开始,一步一步地学习,让你爱上正则表达式。


正式学习之前,先贴两个实用的网站,一个是正则在线调试,一个是正则闯关,可以帮助你更好的学习正则表达式。

  • 正则在线调试: https://regexr-cn.com/
  • 正则闯关: https://codejiaonang.com/#/courses

本文会涉及一些小题目,答案会公布在评论区里,大伙可以先自行思考,再去评论区里找答案。

入门

基础使用

单词匹配,直接将单词写在正则中即可。

  • 题目1:匹配出 I love javascript 中的 javascript

修饰符

我们经常看到的一些正则后带了字母,如:/abc/ig,其中ig就是修饰符的意思。

修饰符含义描述
gglobal - 全局匹配查找所有的匹配项。
iignore - 不区分大小写将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
mmulti line - 多行匹配使边界字符 ^$ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
sdotall - 特殊字符圆点 . 中包含换行符 \默认情况下的圆点 .是匹配除换行符 \n之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n
uunicode - 开启完整的Unicode支持不常用,可以参考:https://zh.javascript.info/regexp-unicode
ysticky - 粘性只会从lastIndex位置开始匹配,且如果设置了全局标识(g)的话会被忽略。不常用,可以参考:https://zh.javascript.info/regexp-sticky

字符组

在使用正则时,有时需要在一个地方匹配多个字符,这时就需要使用字符组。

字符组含义描述
[ABC]字符匹配匹配 […] 中所有的字符,可以为数字、字母、特殊字符及Unicode编码
[^ABC]取反匹配匹配除了 […] 中指定字符以外的所有字符
[a-z]区间匹配匹配 a-z 区间的字符,同理还有 A-Z 和 0-9
  • 题目2:匹配出 I love javascript 中的 av
  • 题目3:匹配出 I love javascript 中除了 av 的字符
  • 题目4:匹配出 I Love Javascript0123456789 中所有的大写字母和数字

快捷方式

对于很多常用的字符组,正则表达式提供了一些快捷方式,可以减少我们的输入量。

快捷方式描述
\w匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
\W匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]
\d匹配任意一个阿拉伯数字(0 到 9)。等价于 [0-9]
\D匹配任意一个非阿拉伯数字。等价于 [^0-9]
\s匹配所有空白符,包括换行,等价于 [ \f\n\r\t\v]
\S匹配所有非空白符
.匹配所有字符,除换行符(修饰符s打开后也包括换行符)
\b匹配单词边界
\B匹配非单词边界
\f匹配一个换页符。等价于 \x0c\cL
\n匹配一个换行符。等价于 \x0a\cJ
\r匹配一个回车符。等价于 \x0d\cM
\t匹配一个制表符。等价于 \x09\cI
\v匹配一个垂直制表符。等价于 \x0b\cK

匹配元字符本身(转义符)

如果我们要匹配元字符本身,比如 {} 或者 \w 这种字符串,那么就要在元字符之前再加一个 \。例如:\n 匹配一个换行符。序列 \\ 匹配 \\( 则匹配 (

开始和结束

字符描述
^在正则开始时使用,匹配输入字符串的结束位置,如果设置了RegExp 对象的 Multiline 属性,^ 也匹配 \n\r 之后的位置。(/^a/ 表示以a为开头)
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配任何新行的开始位置。
  • 题目5:匹配网址(low版):以http://为开头,以.com为结尾,快用正则匹配以下用例吧:
// 需要匹配的
http://www.baidu.com
http://regexr-cn.com
// 不能匹配的
http://www
dshadsa://dsads--dsadsa

量词

如果我们想进行多次匹配,那么就需要用到我们的量词。

量词描述
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。请注意在逗号和两个数之间不能有空格。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
  • 题目6:匹配手机号:
    • 必须是11位数字
    • 第一位数字必须是1
    • 第二位是3、4、5、7、8
    • 后面9位是0-9的数字
// 需要匹配的
13811113646
15699995750
// 不能匹配的
29711001111
30711001111

贪婪or非贪婪

  • 贪婪匹配:尽可能多的匹配字符,正则中默认匹配就是贪婪匹配。
  • 非贪婪匹配:尽可能少的匹配字符,在量词 (*, +, ?, {n}, {n,}, {n,m})后加一个?,开启非贪婪模式。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。

进阶

分组

()中的内容,代表一个分组,表示一个小整体,也可以将该分组匹配出来的内容提取出来进行使用。

分组-或

有时我们需要对多个词组进行匹配,这时就需要使用分组或(xxx|yyy)

  • 题目7:匹配音频格式的文件(以.jpg .jpeg .gif .png .svg结尾的文件)
// 需要匹配的
123a.jpg
a123.jpeg
dsadsaa.svg
fsaa.png
adas.gif
// 不能匹配的
adas.gif123
a123.mp4
dsaa.rmvb

分组-提取

()中的内容将会被提取出来,在后方可以使用\1\2\3…来引用第几个分组匹配到的内容

  • 题目8:匹配带HTML双标签的字符串
// 需要匹配的
<div>hello</div>
32132<span>world</span>12323
// 不能匹配的
dsahdsa
<div>world</p>
  • 题目9:匹配长度6以内的回文字符串
// 需要匹配的
aa
abba
abccba
abcba
// 不能匹配的
ababab
abxyzba

分组-不提取

有时,我们只想使用()对表达式进行整体的分隔,但并不想让其纳入分组提取的编排中,就可以使用(?:partten)。比如正则中的reg.exec方法(后面会讲),会将分组提取出来,但是我们并不想要这个分组,这时就可以使用(?:partten)

  • 只提取年月日中的年份:(\d{4})-(?:\d{2})-(?:\d{2})

断言

正则表达式中的零宽断言是一种特殊的结构,它在匹配的时候不会消耗字符,只是对匹配位置进行条件判断。这对于一些复杂的模式匹配非常有用,因为它允许你在匹配位置前面或后面添加条件,从而更精确地控制匹配。

正则表达式的先行断言和后行断言一共有 4 种形式:

  • (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)
  • (?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)
  • (?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)
  • (?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)

这里面的 pattern 是一个正则表达式。

如同 ^ 代表开头,$ 代表结尾,\b 代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为"零宽"。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。

正向先行断言

  • 题目10:匹配出“我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你”中所有喜欢后面有“你”的“喜欢”
  • 题目11:使用正则校验密码强度,要求如下:
    • 至少一个大写字母
    • 至少一个小写字母
    • 至少一个数字
    • 至少8个字符
// 需要匹配的
wdfqe#wefDdf444
Codejiaonang123
CodeJiaonang@qq1
111111abc11ABc
CodeJiaonang123
// 不能匹配的
qwe
8848
123456
asd123
Adm123

负向先行断言

  • 题目12:匹配出“我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你”中所有喜欢后面没有“你”的“喜欢”

正向后行断言

  • 题目13:匹配出“我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你”中所有喜欢前面有“我”的“喜欢”

负向后行断言

  • 题目14:匹配出“我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你”中所有喜欢前面没有“我”的“喜欢”

小测验-匹配网址(完善版)

https://xwv5.aidoutang.com/dwpush/#/bury/board-detail?id=1

url组成部分是否必须规则
scheme以http://或者https://开头,当然也可以加上ftp等协议
host域名部分由无数个数字、字母、下划线或中划线组成,且最少有一个".“在中间,且”."的前后必须有字符
port":"和至少一位数字组成
path以"/“开头,后面由数字、字母、”_“、”-“、”.“、”/“、”%"组成,当然,后面的内容也可以没有,直接为/
hash以"#/“开头,后面由数字、字母、”_“、”-“、”.“、”/“、”%"组成,当然,后面的内容也可以没有,直接为#/
query以"?“开头,后面由数字、字母、”_“、”-“、”.“、”/“、”%“、”=" 组成,当然,后面的内容也可以没有,直接为?

匹配示例:

http://www.xiwang.com
http://www.xiwang.com/
ftp://ftp.com/123
http://iii.xiwang.com:8080
http://iii.xiwang.com:8080/touch-renewal-center
http://iii.xiwang.com:8080/touch-renewal-center.html
http://iii.xiwang.com:8080/touch-renewal-center?app_blid=30
https://xwv5.aidoutang.com/dwpush#/bury/board-detail
https://xwv5.aidoutang.com/dwpush/#/bury/board-detail?id=1

JS 中的正则

我们学会了正则的怎么写,那么我们又在平时的开发过程中怎么使用呢?

RegExp对象

创建

js中,创建正则有两种方式:

const reg1 =new RegExp('(\\d{4})-(\\d{2})-(\\d{2})','g') // 构造函数实例化方式
const reg2 = /(\d{4})-(\d{2})-(\d{2})/g // 字面量方式创建
  1. 如果采用正则对象方式,RegExg接收的是字符串,\反斜杠是转义字符,\d会变成d,此时需要使用两个反斜杠,即\\d来达到\d效果;但是在字面量方式中,不是字符串,所以使用一个反斜杠即可。
  2. 正则对象方式,可以接收参数,而正则字面量方式不可以。
var regx = new RegExp("^[a-zA-Z0-9]{"+param1+","+param2+"}$","gim");

RegExp.prototype.test()

使用正则匹配字符串,来判断字符串是否满足该正则。

  • 入参:需校验的字符串
  • 返回:匹配到返回true,否则返回false
let reg = new RegExp('(\\d{4})-(\\d{2})-(\\d{2})','g')
console.log(reg.test('2015-12-25'))  // true
console.log(reg.test('2015/12/25'))  // false

RegExp.prototype.exec()

使用正则执行字符串,返回执行结果,能够拿到具体的匹配单元。

  • 入参:需执行的字符串
  • 返回<array|null>,匹配到返回伪数组:{0: matchStr【, 1: group1, 2: group2…】, index: 0, input: ‘’,groups: {…} },匹配不到返回null
参数名称类型含义
0stringmatchStr,匹配到的字符串
1~Nstringgroup1~groupN,正则中设置的捕获分组匹配到的内容,从第一个分组开始依次往后排开
indexnumber匹配到的字符串的首字符在整个字符串中的位置
inputstring参数传入的字符串整体
groupsobject当正则中设置了具名捕获分组:(?\d{4}),那么该分组捕获的内容将会进入到groups中

非全局匹配模式中,每一次匹配都会从字符串的开头开始计算(每次匹配完成后lastIndex都会重置为0)
全局匹配模式中:每一次匹配的都会从上一次匹配完成后的位置开始(从上一次匹配完成后的lastIndex开始)

let str = `1996-09-06 ~ 2024/07/23`;
// 非全局
let reg = /(\d{4})[-/ ](\d{2})[-/ ](\d{2})/;
console.log(reg.lastIndex) // 0
console.log(reg.exec(str));
// ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: undefined]
console.log(reg.lastIndex) // 0
console.log(reg.exec(str));
// ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: undefined]
console.log(reg.lastIndex) // 0
console.log(reg.exec(str));
// ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: undefined]

// 全局
let reg1 = /(\d{4})[-/ ](\d{2})[-/ ](\d{2})/g;
console.log(reg1.lastIndex) // 0
console.log(reg1.exec(str));
// ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: undefined]
console.log(reg1.lastIndex) // 10
console.log(reg1.exec(str));
// ['2024/07/23', '2024', '07', '23', index: 13, input: '1996-09-06 ~ 2024/07/23', groups: undefined]
console.log(reg1.lastIndex) // 23
console.log(reg1.exec(str));
// null

// 带有具名捕获分组的正则
let reg2 = /(?<year>\d{4})[-/ ](?<month>\d{2})[-/ ](?<day>\d{2})/g;
console.log(reg2.exec(str));
// ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: {year: '1996', month: '09', day: '06'}]
console.log(reg2.exec(str));
// ['2024/07/23', '2024', '07', '23', index: 13, input: '1996-09-06 ~ 2024/07/23', groups: {year: '2024', month: '07', day: '23'}]
console.log(reg2.exec(str));
// null

String中的正则

String.prototype.search(reg)

search方法用于检索满足正则条件的字符串在源字符串中的的位置。

  • 入参<string|reg>:查找条件,可以是字符串,也可以是正则,传入字符串将会被转化为正则来处理。
  • 返回:方法返回第一个匹配结果 index,查找不到返回 -1

search() 方法不执行全局匹配,它将忽略标志 g,并且总是从字符串的开始进行检索

let str = `1996-09-06 ~ 2024/07/23`;
let reg = /(\d{4})[-/ ](\d{2})[-/ ](\d{2})/g;
console.log(str.search(reg)); // 0
console.log(str.search(reg)); // 0

String.prototype.match(reg)

用于匹配并获取字符串中满足正则的子串

  • 入参<string|reg>:查找条件,可以是字符串,也可以是正则,传入字符串将会被转化为正则来处理;
  • 返回<array|null>:匹配到返回数组,否则返回null,且正则是否有标志g对结果影响很大
    • 非全局模式下,只返回第一个匹配的内容,结果类似reg.exec()方法的返回。
    • 全局模式下,将所有匹配到的字符串组成为一个数组返回,不会返回每个匹配的groups和index等信息。
let str = `1996-09-06 ~ 2024/07/23`;

// 非全局
let reg = /(\d{4})[-/ ](\d{2})[-/ ](\d{2})/;
console.log(str.match(reg));
// ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: undefined]

// 全局
let reg1 = /(\d{4})[-/ ](\d{2})[-/ ](\d{2})/g;
console.log(str.match(reg1));
// ['1996-09-06', '2024/07/23']

String.prototype.matchAll(reg)

用于匹配并获取字符串中所有满足正则的子串。

  • 入参<string|reg>:查找条件,可以是字符串,也可以是正则,传入字符串将会被转化为正则来处理;
  • 返回:返回一个正则匹配结果的迭代器,可以使用for…of…遍历,或者使用Array.from()和扩展符(…)将其转为数组。其中每一项类似reg.exec()返回的结果
    注意:string.matchAll(reg)中的正则,必须是全局模式的,否则会报错。
let str = `1996-09-06 ~ 2024/07/23`;
let reg = /(\d{4})[-/ ](\d{2})[-/ ](\d{2})/g;
console.log(Array.from(str.matchAll(reg)));
[
  ['1996-09-06', '1996', '09', '06', index: 0, input: '1996-09-06 ~ 2024/07/23', groups: undefined],
  ['2024/07/23', '2024', '07', '23', index: 13, input: '1996-09-06 ~ 2024/07/23', groups: undefined]
]

String.prototype.split(reg)

以传入的正则将字符串拆分为数组。

  • 入参<string|reg>:查找条件,可以是字符串,也可以是正则,传入字符串将会被转化为正则来处理
  • 返回:返回分隔后的内容,如果分隔符是包含捕获括号的正则表达式,则每次分隔符匹配时,捕获括号的结果(包括任何未定义的结果)将被拼接到输出数组中。
let str = `1996-09-06 ~ 2024/07/23`;

let reg = /\d{4}[-/ ]\d{2}[-/ ]\d{2}/;
console.log(str.split(reg));
// [ '', ' ~ ', '' ]

let reg1 = /(\d{4}[-/ ]\d{2}[-/ ]\d{2})/;
console.log(str.split(reg1));
// [ '', '1996-09-06', ' ~ ', '2024/07/23', '' ]

String.prototype.replace()

根据正则匹配到字符串中的内容,进行替换

  • String.prototype.replace(reg|str,replaceStr)
  • String.prototype.replace(reg,function)
    • function 会在每次匹配替换的时候调用,其参数类似于reg.exec()的返回结果
  • 返回:经过替换后的字符串
let str = `1996-09-06 ~ 2024/07/23`;
let reg = /(?<year>\d{4})[-/ ](?<month>\d{2})[-/ ](\d{2})/g;
console.log(str.replace(reg, '日期'));
// 日期 ~ 日期
console.log(str.replace(reg, function(match,group1,group2,group3,index,origin, groups) {
    console.log('匹配到的内容:', match, group1, group2, group3, index, origin, groups);
    // 匹配到的内容: 1996-09-06 1996 09 06 0 1996-09-06 ~ 2024/07/23 {year: '1996', month: '09'}
    // 匹配到的内容: 2024/07/23 2024 07 23 13 1996-09-06 ~ 2024/07/23 {year: '2024', month: '07'}
    return `${groups.year}${groups.month}${group3}`;
}));
// 1996年09月06日 ~ 2024年07月23日

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

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

相关文章

给Windows系统中注入服务,即windwos守护进程

最近总是在windwos环境下测试nginx&#xff0c;总是需要频繁重启nginx服务。于是考虑有没有可能把nginx加入到系统服务的操作。在网上找了一大堆资料&#xff0c;现在来总结一下&#xff01; 方法1&#xff1a;利用nssm工具实现 这是一个守护进程的软件&#xff0c;可以在win…

初阶数据结构——二叉树大汇总

这篇博客将会讲到二叉树的部分内容及堆的相关知识~ 这里将会涉及到大量的递归&#xff08;头大&#xff09; 目录 1.树 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树的实际应用 2.二叉树 2.1二叉树的概念 2.2特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.2…

【昇腾AI创新大赛集训营南京站学习笔记】-Ascend算子开发课程

昇腾AI创新大赛训练营 14:00-14:30 基础知识-理论课 一、CANN 、达芬奇架构和算子 1.AI Core逻辑架构 达芬奇架构包含三部分&#xff1a; 1&#xff09;计算类&#xff1a;矩阵计算单元&#xff08;两个矩阵扔进去相乘&#xff09;、向量计算单元、标量计算单元 2&#xff09;控…

一天搞定React(4)——Redux

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

鸿蒙OpenHarmony Native API【drawing_path.h】 头文件

drawing_path.h Overview Related Modules: [Drawing] Description: 文件中定义了与自定义路径相关的功能函数 Since: 8 Version: 1.0 Summary Functions FunctionDescription[OH_Drawing_PathCreate] (void)[OH_Drawing_Path] * 函数用于创建一个路径对象OH_Drawin…

前端页面:用户交互持续时间跟踪(duration)user-interaction-tracker

引言 在用户至上的时代&#xff0c;精准把握用户行为已成为产品优化的关键。本文将详细介绍 user-interaction-tracker 库&#xff0c;它提供了一种高效的解决方案&#xff0c;用于跟踪用户交互的持续时间&#xff0c;并提升项目埋点的效率。通过本文&#xff0c;你将了解到如…

EXO-chatgpt_api 解释

目录 chatgpt_api 解释 resolve_tinygrad_tokenizer 函数 resolve_tokenizer 函数 调试和日志记录​​​​​​​ 参数 返回值 初始化方法 __init__ 异步方法 注意事项 chatgpt_api 解释 展示了如何在一个项目中组织和导入各种库、模块和类,以及如何进行一些基本的We…

双向链表(C语言版)

1. 双向链表的结构 注意&#xff1a;这里的“带头”跟单链表的“头结点”是两个概念&#xff0c;实际上在单链表阶段称呼不太严谨&#xff0c;但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位结点不存储任何有…

rsync文件远程同步

目录 一、什么是rsync远程同步 二、实操rsync远程文件同步 1、配置rsync同步源 2、客户端部署 3、增量备份​编辑 4、删除文件 5、如何实现免交互登录 6、crontab rsync 实现定时同步 7、使用ssh实现rsync数据同步【☆】 如何使用ssh免交互实现数据同步&#xff1f;…

C++ Map Set的模拟实现

C Map Set的模拟实现 文章目录 前言一、Map 和 Set是什么&#xff1f;1.Set2.Map 二、困难点困难一、set和map中值的类型不同困难二、Map和Set中值不可修改困难三、红黑树中迭代器的和--1.2.- - 困难四、map中[ ] 运算符重载的实现1.修改红黑树以及Map和Set中insert的返回值1.修…

Spring Boot入门指南:轻松构建高效Spring应用(四)

Spring Boot入门指南&#xff1a;轻松构建高效Spring应用&#xff08;三&#xff09;-CSDN博客 一.传递参数 7.传递数组 1.在IDEA中写出处理代码 2.打开postman 或者这样:key相同时&#xff0c;也会组成一个数组。 8. 传递集合 如果像数组传参一样传递集合&#xff0c;可能…

Transformer合集

资料 位置编码&#xff1a;https://zhuanlan.zhihu.com/p/454482273 自注意力&#xff1a;https://zhuanlan.zhihu.com/p/455399791 LN&#xff1a;https://zhuanlan.zhihu.com/p/456863215 ResNet&#xff1a;https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章&#xff0c;我们提到了 keyword&#xff08;一笔带过&#xff09;。在本章&#xff0c;我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型&#xff08;仅介绍开发中常用&#xff0c;更多内容请自…

接口自动化测试框架实战-4-日志方法封装

上一小节我们讲解了文件读写方法的封装方法,本小节我们完成一下框架日志的封装方法。 首先我们讲解一下日志封装和日志记录有哪些用处? 更加方便的设置日志的格式和输出方式全局方法可以各个类/函数中都能统一调用分类记录接口用例执行日志,方便嵌入测试报告错误日志提示,…

乘云数字受邀Zabbix MeetUp济南站,分享《DataBuff在打造可观测性数据底座上的探索》

7月20日&#xff0c;Zabbix主办的MeetUp线下活动在济南圆满举行&#xff0c;众多技术大咖汇集现场&#xff0c;交流技术知识、分享先进的思想。乘云数字受邀参加此次盛宴&#xff0c;创始人兼CEO向成钢在现场发表了关于“DataBuff在打造可观测性数据底座上的探索”的主题演讲。…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文&#xff1a;CLIP-KD: An Empirical Study of CLIP Model Distillation 链接&#xff1a;https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation&#xff1a;使用大的Teacher CLIP模型有监督蒸馏小CLIP模型&#xff0c;出发点基于在资源受限的应用中&…

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日&#xff0c;NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询&#xff0c; NFTScan 用户能够轻松地使用域名追踪 NFT 交易&#xff0c;为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…

C++树形结构(2 树的直径)

目录 1.定义&#xff1a; 2.直径的性质&#xff1a; 3.树的直径求解方法&#xff1a; 4.直径端点求解方法&#xff1a; 朴素方法&#xff1a; 优化方法&#xff1a; 5.例题&#xff1a; 6.直径公共点&#xff1a; 7.例题&#xff1a; 8.去掉再加上&#xff1a; 9.例…

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…

vue3前端开发-小兔鲜项目-图片切换效果和动态class

vue3前端开发-小兔鲜项目-图片切换效果和动态class!这次实现的效果是&#xff0c;图片预览效果&#xff0c;根据小图片&#xff0c;来实时改变大图&#xff08;预览&#xff09;的效果。同时让动态的特征class也跟着显示出来。 <script setup> import {ref} from vue // …