js:正则表达式
目录
正则表达式的语法
定义
检测
检索
元字符
边界符
量词
字符类
表单判断案例
修饰符
过滤敏感词
正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本字符组合模式
正则表达式是一种通用的模式,在js里一般用作验证表单:
用户名表单只能输入英文字母、数字或者下划线, 昵称输入框中可以输入中文(匹配)
过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等 。
正则表达式的语法
定义
定义正则表达式的语法,//内部是正则表达式的字面量
const reg=/兔子/
检测
使用test()方法:查看正则表达式与指定的字符串是否匹配
const str='我有三只小兔子'
//定义正则表达式
const reg=/兔子/
//是否匹配
console.log(reg.test(str));
匹配上了返回true,没匹配上返回false
reg是正则表达式的对象,test()是reg对象的方法,而定义的正则表达式就相当于一套规则
在实际使用中我们要先有一套规则,再进行检验
检索
除了test()还有一个方法
exec()方法:在一个指定字符串中执行一个搜索匹配
const str='我有三只小兔子,分别是阿米娅兔兔,特雷西娅兔兔,德克萨斯兔兔'//定义正则表达式const reg=/兔兔///是否匹配console.log(reg.exec(str));

其中的index表示数组的下标14的位置上匹配成功
返回值不同是test()和exec()最大的区别
元字符
普通的字符只能描述他们本身,而元字符是一些具有特殊意义的字符,可以匹配一类字符,例如普通字符里想表示26个英文字母,需要abcdefg......一个一个写出来,但是元字符可以用[a-z]来表示这些字符
极大提高了灵活性和强大的匹配功能。
参考文档:MDN:https://developer.mozilla.org/zhCN/docs/Web/JavaScript/Guide/Regular_Expressions
正则表达式的测试工具: http://tool.oschina.net/regex
元字符太多了,所以我们对它做出分类,分别是边界符、量词、字符类
边界符
表示字符的位置,必须以某某字符开头、结尾等格式要求

第一个true:str里含有gigity
第二个和第三个的true是因为str以gigity开头/结尾
如果想要精确匹配:
//以某一字符开头,以某一字符结尾
console.log(/^gigity$/.test(str))
答案为什么是false?

当我们确定字符串的^和$(也就是开头和结尾),你们这个开头和结尾必须是同一个字符
也就是说只有这种情况才为true:
//和正则表达式里面的字符一模一样才是true
console.log(/^gigity$/.test('gigity'))/'/true
欸,那你就要问了(谁问你了)怎么表示多个重复字符的正则表达式字面量呢?所以我们要学:
量词
表示字符的重复次数,设定某个模式出现的次数

*:
const str = 'ygigitygigitygigitygigity'console.log(/^gigity*$/.test(str));//falseconsole.log(/y*$/.test(str));//true
为什么第一个是false?第二个是true?
首先,在字符后面加【*】则这个字符只作用于该字符正前方的字符也就是【y】,那么这句正则表达式的意思就变成了【匹配的是以 "gigity" 开头,后面可以跟 0 个或多个 y 的字符串】,而该字符不满足这个规则,所以false
所以根据这个规则,我们写成第二种形式的意思是【含0个或多个y并且以y结尾的字符串】,str满足条件,所以true
如果你想匹配多个 "gigity" 的重复,可以使用 /^(gigity)+$/:
const str = 'gigitygigitygigitygigity';
console.log(/^(gigity)+$/.test(str)); // true
当然如果我们写成这样:
console.log(/^y*$/.test(str));
就false了,因为这样的写法要求【字符串里只能有0或0个以上的y】
+:
改为+也很好理解,至少有一个【y】
const str = 'ygigitygigitygigitygigity'console.log(/^gigity+$/.test(str));//falseconsole.log(/y+$/.test(str));//true
?:
只有出现0和1次为true,其余都为false
const str = 'ygigitygigitygigitygigity'console.log(/^gigity?$/.test(str));//falseconsole.log(/y?$/.test(str));//true
当然,以上三种量词也可以辨别空白:
console.log(/^y*$/.test(''));//trueconsole.log(/^y+$/.test(''));//falseconsole.log(/^y?$/.test(''));//true
还可以设置固定字符出现的次数:只有只出现四个【y】时为true
console.log(/^y{3}$/.test(''));//false
console.log(/^y{3}$/.test('y'));//false
console.log(/^y{3}$/.test('yy'));//false
console.log(/^y{3}$/.test('yyy'));//true
可以用作判别手机号、验证码、身份证号码输入的位数是否正确
大于等于3即为true:
console.log(/^y{3,}$/.test('yy'));//false
console.log(/^y{3,}$/.test('yyy'));//true
console.log(/^y{3,}$/.test('yyyy'));//true
console.log(/^y{3,}$/.test('yyyyy'));//true
大于等于三,小于等于4即为true(注意{n,m}【,】左右两边没有空格):
console.log(/^y{3,4}$/.test('yy'));//false
console.log(/^y{3,4}$/.test('yyy'));//true
console.log(/^y{3,4}$/.test('yyyy'));//true
console.log(/^y{3,4}$/.test('yyyyy'));//false
字符类
类似于[a-z]等表示一类字符的元字符,\d表示0~9(其实我在学makefile的时候就没觉得正则表达式方便到哪去)
[]匹配字符集合,后面的字符串只要包含abc中的任意一个字符,都返回true:

当判定为【字符串里含a/b/c里的一个以上】的时候会判定为false,但是用上量词,就会变为true:![]()
使用连字符表示一个范围:
Ø [a-z] 表示 a 到 z 26个英文字母都可以
Ø [a-zA-Z] 表示大小写都可以
Ø [0-9] 表示 0~9 的数字都可以
比如:

1、在[]内加^符表示取反,和[]内的字符取反,[^abc]表示【abc之外的所有其他字符】
2、【.】匹配除了换行符的任何单个字符
3、预定义类: 某些常见模式的简写方式。

表单判断案例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>span {display: inline-block;width: 250px;height: 30px;vertical-align: middle;line-height: 30px;padding-left: 15px;}.error {color: red;/* background: url(./images/error1.png) no-repeat left center; */}.right {color: green;/* background: url(./images/right.png) no-repeat left center; */}</style>
</head><body><input type="text"><span></span><script>const reg = /^[a-zA-Z0-9-_]{6,16}$/const input = document.querySelector('input')const span = document.querySelector('span')input.addEventListener('blur', function () {if (reg.test(this.value)) {span.innerHTML = '输入正确'span.classList.remove('error')span.classList.add('right')} else {span.innerHTML = '请输入6-16位的英文、数字或下划线'// span.classList.remove('right')// span.classList.add('error')也可以用className来修改类名span.className='error'}})</script>
</body></html>
修饰符
修饰符约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等
语法:

i 是单词 ignore 的缩写,正则匹配时字母不区分大小写

g 是单词 global 的缩写,匹配所有满足正则表达式的结果,一般用于全局替换
替换:replace 替换

和g一起作用,或是【|】竖线:

![]()
过滤敏感词
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><textarea name="" id="" cols="30" rows="10"></textarea><button>发布</button><div></div><script>const tx = document.querySelector('textarea')const btn = document.querySelector('button')const div = document.querySelector('div')btn.addEventListener('click', function () {// console.log(tx.value)div.innerHTML = tx.value.replace(/wcnm/g,'我上早八')})</script>
</body></html>

注册界面
利用之前学过的东西写一个注册页面
其中讲到了两个新的知识点:
change事件,是判断表单和之前的内容有没有区别的事件
classList.contains()可以确定该元素有没有包含某个类


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>小兔鲜儿 - 新鲜 惠民 快捷!</title><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="renderer" content="webkit"><link rel="shortcut icon" href="./favicon.ico"><link rel="stylesheet" href="./css/common.css"><link rel="stylesheet" href="./css/register.css"><link rel="stylesheet" href="https://at.alicdn.com/t/font_2143783_iq6z4ey5vu.css">
</head><body><!-- 项部导航 --><div class="xtx_topnav"><div class="wrapper"><!-- 顶部导航 --><ul class="xtx_navs"><li><a href="./login.html">请先登录</a></li><li><a href="./register.html">免费注册</a></li><li><a href="./center-order.html">我的订单</a></li><li><a href="./center.html">会员中心</a></li><li><a href="javascript:;">帮助中心</a></li><li><a href="javascript:;">在线客服</a></li><li><a href="javascript:;"><i class="mobile sprites"></i>手机版</a></li></ul></div></div><!-- 头部 --><div class="xtx_header"><div class="wrapper"><!-- 网站Logo --><h1 class="xtx_logo"><a href="/">小兔鲜儿</a></h1><!-- 主导航 --><div class="xtx_navs"><ul class="clearfix"><li><a href="./index.html">首页</a></li><li><a href="./category01.html">生鲜</a></li><li><a href="./category01.html">美食</a></li><li><a href="./category01.html">餐厨</a></li><li><a href="./category01.html">电器</a></li><li><a href="./category01.html">居家</a></li><li><a href="./category01.html">洗护</a></li><li><a href="./category01.html">孕婴</a></li><li><a href="./category01.html">服装</a></li></ul></div><!-- 站内搜索 --><div class="xtx_search clearfix"><!-- 购物车 --><a href="./cart-none.html" class="xtx_search_cart sprites"><i>2</i></a><!-- 搜索框 --><div class="xtx_search_wrapper"><input type="text" placeholder="搜一搜" onclick="location.href='./search.html'"></div></div></div></div><div class="xtx-wrapper"><div class="container"><!-- 卡片 --><div class="xtx-card"><h3>新用户注册</h3><form class="xtx-form"><div data-prop="username" class="xtx-form-item"><span class="iconfont icon-zhanghao"></span><input name="username" type="text" placeholder="设置用户名称"><span class="msg"></span></div><div data-prop="phone" class="xtx-form-item"><span class="iconfont icon-shouji"></span><input name="phone" type="text" placeholder="输入手机号码 "><span class="msg"></span></div><div data-prop="code" class="xtx-form-item"><span class="iconfont icon-zhibiaozhushibiaozhu"></span><input name="code" type="text" placeholder="短信验证码"><span class="msg"></span><a class="code" href="javascript:;">发送验证码</a></div><div data-prop="password" class="xtx-form-item"><span class="iconfont icon-suo"></span><input name="password" type="password" placeholder="设置6至20位字母、数字和符号组合"><span class="msg"></span></div><div data-prop="confirm" class="xtx-form-item"><span class="iconfont icon-suo"></span><input name="confirm" type="password" placeholder="请再次输入上面密码"><span class="msg"></span></div><div class="xtx-form-item pl50"><i class="iconfont icon-queren"></i>已阅读并同意<i>《用户服务协议》</i></div><div class="xtx-form-item"><button class="submit">下一步</button><!-- <a class="submit" href="javascript:;">下一步</a> --></div></form></div></div></div><!-- 公共底部 --><div class="xtx_footer clearfix"><div class="wrapper"><!-- 联系我们 --><div class="contact clearfix"><dl><dt>客户服务</dt><dd class="chat">在线客服</dd><dd class="feedback">问题反馈</dd></dl><dl><dt>关注我们</dt><dd class="weixin">公众号</dd><dd class="weibo">微博</dd></dl><dl><dt>下载APP</dt><dd class="qrcode"><img src="./uploads/qrcode.jpg"></dd><dd class="download"><span>扫描二维码</span><span>立马下载APP</span><a href="javascript:;">下载页面</a></dd></dl><dl><dt>服务热线</dt><dd class="hotline">400-0000-000<small>周一至周日 8:00-18:00</small></dd></dl></div></div><!-- 其它 --><div class="extra"><div class="wrapper"><!-- 口号 --><div class="slogan"><a href="javascript:;" class="price">价格亲民</a><a href="javascript:;" class="express">物流快捷</a><a href="javascript:;" class="quality">品质新鲜</a></div><!-- 版权信息 --><div class="copyright"><p><a href="javascript:;">关于我们</a><a href="javascript:;">帮助中心</a><a href="javascript:;">售后服务</a><a href="javascript:;">配送与验收</a><a href="javascript:;">商务合作</a><a href="javascript:;">搜索推荐</a><a href="javascript:;">友情链接</a></p><p>CopyRight © 小兔鲜儿</p></div></div></div></div><script>//验证码模块const code = document.querySelector('.code')let flag = truelet timerId = code.addEventListener('click', function () {if (flag) {flag = falselet i = 5code.innerHTML = `0${i}秒后重新获取`setInterval(function () {i--code.innerHTML = `0${i}秒后重新获取`if (i === 0) {clearInterval(timerId)flag = truecode.innerHTML = `重新获取`}}, 1000)}})//用户名验证const username = document.querySelector('[name=username]')username.addEventListener('change', verifyName)function verifyName() {//使用正则表达式验证const reg = /^[a-zA-Z0-9-_]{6,10}$///使用兄弟节点操纵span,因为dom树里有很多spanconst span = username.nextElementSibling//如果不通过if (!reg.test(username.value)) {//console.log('不通过');span.innerText = '输入不合法,请输入6~10位'return false}//如果通过span.innerText = ''return true}//手机号验证const phone = document.querySelector('[name=phone]')phone.addEventListener('change', verifyPhone)function verifyPhone() {//使用正则表达式验证const reg = /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$///使用兄弟节点操纵span,因为dom树里有很多spanconst span = phone.nextElementSibling//如果不通过if (!reg.test(phone.value)) {//console.log('不通过');span.innerText = '输入不合法,请输入正确的11位手机号'return false}//如果通过span.innerText = ''return true}//验证码验证const codeInput = document.querySelector('[name=code]')codeInput.addEventListener('change', verifyCodeInput)function verifyCodeInput() {//使用正则表达式验证const reg = /^\d{6}$///使用兄弟节点操纵span,因为dom树里有很多spanconst span = codeInput.nextElementSibling//如果不通过if (!reg.test(codeInput.value)) {//console.log('不通过');span.innerText = '输入不合法,请输入6位数字'return false}//如果通过span.innerText = ''return true}//密码验证const password = document.querySelector('[name=password]')password.addEventListener('change', verifyPassword)function verifyPassword() {//使用正则表达式验证const reg = /^[a-zA-Z0-9-_]{6,20}$///使用兄弟节点操纵span,因为dom树里有很多spanconst span = password.nextElementSibling//如果不通过if (!reg.test(password.value)) {//console.log('不通过');span.innerText = '输入不合法,请输入6~20位数字、字母和符号'return false}//如果通过span.innerText = ''return true}//再次输入密码const confirm = document.querySelector('[name=confirm]')confirm.addEventListener('change', verifyConfirm)function verifyConfirm() {//使用兄弟节点操纵span,因为dom树里有很多spanconst span = confirm.nextElementSibling//如果不通过if (confirm.value !== password.value) {//console.log('两次输入密码不一致');span.innerText = '两次输入密码不一致'return false}//如果通过span.innerText = ''return true}//用户协议勾选状态切换const queren = document.querySelector('.icon-queren')queren.addEventListener('click', function () {//切换类,原有的删掉,没有的添加this.classList.toggle('icon-queren2')})//表单提交//没有勾选同意协议,提示需要勾选:classList.contains()查看有没有包含某个类,如果有则返回true,没有返回false//验证模块中有一个返回false则阻止提交const form = document.querySelector('form')form.addEventListener('submit', function () {if (!queren.classList.contains('icon-queren2')) {alert('请勾选同意协议')//阻止默认行为才能真正阻止提交e.preventDefault()}//判断先前的验证模块,返回false就代表没有通过验证if (!verifyName()) e.preventDefault()if (!verifyPhone) e.preventDefault()if (!verifyPassword) e.preventDefault()if (!verifyCodeInput) e.preventDefault()if (!verifyConfirm) e.preventDefault()})</script>
</body></html>
登录界面:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>小兔鲜儿 - 新鲜 惠民 快捷!</title><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="renderer" content="webkit"><link rel="shortcut icon" href="../favicon.ico"><link rel="stylesheet" href="./css/common.css"><link rel="stylesheet" href="./css/login.css"><link rel="stylesheet" href="https://at.alicdn.com/t/font_2143783_iq6z4ey5vu.css">
</head><body><!-- 登录头部 --><div class="xtx-login-header"><h1 class="logo"></h1><a class="home" href="./index.html">进入网站首页</a></div><!-- 登录内容 --><div class="xtx-login-main"><div class="wrapper"><form action="" autocomplete="off"><div class="box"><div class="tab-nav"><a href="javascript:;" class="active" data-id="0">账户登录</a><a href="javascript:;" data-id="1">二维码登录</a></div><div class="tab-pane"><div class="link"><a href="javascript:;">手机验证码登录</a></div><div class="input"><span class="iconfont icon-zhanghao"></span><input required type="text" placeholder="请输入用户名称/手机号码" name="username"></div><div class="input"><span class="iconfont icon-suo"></span><input required type="password" placeholder="请输入密码" name="password"></div><div class="agree"><label for="my-checkbox"><input type="checkbox" value="1" id="my-checkbox" class="remember" name="agree"><span class="iconfont icon-xuanze"></span></label>我已同意 <a href="javascript:;">《服务条款》</a href="javascript:;"> 和 <a>《服务条款》</a></div><div class="button clearfix"><button type="submit" class="dl">登 录</button><!-- <a class="dl" href="./center.html">登 录</a> --><a class="fl" href="./forget.html">忘记密码?</a><a class="fr" href="./register.html">免费注册</a></div></div><div class="tab-pane" style="display: none;"><img class="code" src="./images/code.png" alt=""></div></div></form></div></div><!-- 登录底部 --><div class="xtx-login-footer"><!-- 版权信息 --><div class="copyright"><p><a href="javascript:;">关于我们</a><a href="javascript:;">帮助中心</a><a href="javascript:;">售后服务</a><a href="javascript:;">配送与验收</a><a href="javascript:;">商务合作</a><a href="javascript:;">搜索推荐</a><a href="javascript:;">友情链接</a></p><p>CopyRight © 小兔鲜儿</p></div></div><script>//判断是否通过事件委托来自注册事件,关系太复杂的盒子(互相套来套去不建议使用事件委托)//tab栏切换,使用事件委托const tab_nav = document.querySelector('.tab-nav')const pane = document.querySelectorAll('.tab-pane')tab_nav.addEventListener('click', function (e) {if (e.target.tagName === 'A') {//取消上一个active,位当前元素添加activetab_nav.querySelector('.active').classList.remove('active')e.target.classList.add('active')//通过for()循环将两个盒子都隐藏for (let i = 0; i < pane.length; i++) {pane[i].style.display = 'none'}//让对应需要的pane显示pane[e.target.dataset.id].style.display = 'block'}})//点击提交模块const form = document.querySelector('form')const agree = document.querySelector('[name=agree]')form.addEventListener('submit', function (e) {e.preventDefault()//判断是否勾选同意协议if (!agree.checked) {return alert('请勾选同意协议')}//保存用户名到本地const username = document.querySelector('[name=username]')localStorage.setItem('xtx-uname', username.value)//跳转到主页location.href = './index.html'})</script>
</body></html>
从登陆页面跳转到主页的模块:js
<script>//从登录页面跳转过来 //获取第一个liconst li1 = document.querySelector('.xtx_navs li:first-child')const li2 = li1.nextElementSiblingfunction render() {const uname = localStorage.getItem('xtx-uname')//console.log(uname)if (uname) {li1.innerHTM = `<a href="javascript:;"><i class="iconfont icon-user">${uname}</i></a>`li2.innerHTML = `<a href="javascript:;">退出登录</a>`} else {li1.innerHTML = `<a href="./login.html">请先登录</a>`li2.innerHTML = `<a href="./register.hmtl">免费注册</a>`}}render()//退出登录的模块li2.addEventListener('click', function () {localStorage.removeItem('xtx-uname')render()})</script>
相关文章:
js:正则表达式
目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本字符组合模式 正则表达式是一…...
linux环境使用docker部署多个war项目
如果你的需求是在一个服务器上部署多个Tomcat项目,并且每个项目需要独立运行,可以通过以下方式实现: 1. 使用不同的端口 每个Tomcat项目可以使用不同的端口号(如9090、9091、9092等),并通过Docker容器分别…...
【react】使用antd Table渲染数据遇到的报错问题
记录自己在开发过程中遇到的报错问题: 目录 原本写法:错误分析:解决方案: 原本写法: render: (text) > {console.log(text, "111111text");console.log(typeof text, "111111text");return t…...
JVM之垃圾回收器G1概述的详细解析
G1(并发) G1 特点 G1(Garbage-First)是一款面向服务端应用的垃圾收集器,应用于新生代和老年代、采用标记-整理算法、软实时、低延迟、可设定目标(最大 STW 停顿时间)的垃圾回收器,用于代替 CMS࿰…...
1.15寒假作业
web:nss靶场ez_ez_php 打开环境,理解代码 使用个体传参的方法,首先代码会检查file参数的前三个字符是不是php,如果是就输出nice,然后用include函数包含file,绕过不是则输出hacker,如果没有file…...
RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录
文章目录 1、环境介绍2、目标3、海华AW-CM358SM3.1、基本信息3.2、支持SDIO3.03.3、电气特性 4、适配流程步骤5、SDIO控制器适配5.1、sdio dts配置5.2、验证 6、Wi-Fi 适配6.1、wifi dts配置6.2、驱动移植6.2.1、kernel menuconfig6.2.2、传统驱动移植6.2.3、RK SDK WIFI/BT驱动…...
支持Google Analytics快捷添加的CMS:费用与部署形式详解
CMS 的费用和部署形式是选择平台的重要参考因素,不同的业务需求需要不同的解决方案。本文将从费用和部署形式两个角度,详细分析支持 Google Analytics 快捷集成的 CMS 和工具,帮助您更好地了解这些平台的特点。 1. BigCommerce 费用ÿ…...
CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)
目录 示例1 (中间自适应 示例2(中间自适应 示例3(中间自适应 示例4 (自适应成比 示例5(左中定宽,右边自适应 示例6(中间自适应 示例7(中间自适应 示例8(中间定宽…...
fpga系列 HDL:跨时钟域同步 双触发器同步器
目录 **双触发器同步器(Two-Flip-Flop Synchronizer)示例代码**:双触发器同步器的优缺点优点:缺点:适用场景: 应用实例:同步来自spi_slave的单个使能信号 跨时钟域的设计需要特别小心࿰…...
金融项目实战 05|Python实现接口自动化——登录接口
目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件:jso…...
《HTML在网络安全中的多面应用:从防范攻击到安全审查》
Html基础 Html简介 HTML(HyperText Markup Language,超文本标记语言)是用于描述网页内容和结构的标准语言。以下是对HTML的简要介绍: 基本概念 定义: HTML不是一种编程语言,而是一种标记语言。 它使用标…...
Linux网络 | 学习传输层网络协议之UDP(短篇)
前言: 本节内容正式迈入传输层网络协议的知识殿堂, 之前的文章, 我们都是在应用层进行翻来覆去。 比如http就是应用层协议, 只不过使用了tcp的系统调用。 从本节开始, 友友们将会学习传输层两大协议: UDP和…...
iOS - 内存屏障的使用场景
内存屏障的使用是为了解决以下几个关键问题: 1. CPU 乱序执行 // 没有内存屏障时,CPU 可能乱序执行 void example() {// 这两行代码可能被 CPU 重排序a 1; // 操作1flag true; // 操作2 }// 使用内存屏障确保顺序 void safeExample() {a 1;…...
MySQL 8.0 新特性详解与实用示例
MySQL 8.0 新特性详解与实用示例 1. 引言 MySQL 8.0 是 MySQL 版本系列中具有里程碑意义的更新版本,带来了大量新功能和优化,极大地提升了数据库的性能和可用性。本文将深入介绍 MySQL 8.0 的主要新特性及其应用场景,帮助你在项目中更高效地…...
【STM32-学习笔记-5-】ADC
文章目录 ADCADC函数Ⅰ、ADC_InitTypeDef结构体参数①、ADC_Mode②、ADC_DataAlign③、ADC_ExternalTrigConv④、ADC_ContinuousConvMode⑤、ADC_ScanConvMode⑥、ADC_NbrOfChannel Ⅱ、ADC配置示例1、单次转换,非扫描单次转换非扫描模式下,获取多通道的…...
TY1801 反激变换器PWM GaN功率开关
TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围,非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路,节省系统 BOM 成本。TY1801 支持 Burst&…...
Jenkins安装、插件下载及构建环境配置详解
Jenkins简介 1.1 简介 Jenkins 是一个基于Java开发的开源持续集成工具,它提供了一个开放且易用的软件平台,主要用于自动化构建、测试和部署软件项目,以实现持续集成(CI)和持续交付/部署(CD)。…...
ESP32,uart安装驱动uart_driver_install函数剖析,以及intr_alloc_flags 参数的意义
在 uart_driver_install 函数中,参数 RX_BUF_SIZE * 2 指定了接收缓冲区(RX buffer)的大小。这个参数对于 UART 驱动程序来说非常重要,因为它决定了可以存储多少接收到的数据,直到应用程序读取它们为止。下面是对该函数…...
Ubuntu把应用程序放到桌面
有时候我们下载的软件是一个文件夹,通常需要进入进入指定文件夹下去执行.sh 文件来启动,下面来个实例如何把idea放到桌面 打开文件目录/usr/share/applications/或者~/.local/share/applications/目录。第一个目录是全局的,所有用户都可以使…...
什么是端口映射
端口映射 端口映射(Port Mapping)是一种网络技术,用于将外部网络请求转发到内部网络的特定设备或服务。它通常用于以下场景: 外部访问内部服务:允许外部用户通过公网IP访问内网中的设备或服务。多设备共享IP…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

