JS听到了强运的回响

正则表达式

介绍

正则表达式是用于匹配字符串中字符组合的模式,在JS中,正则表达式也是对象

通常用来查找,替换那些符合正则表达式的文本

就是筛选出符合条件的一类人

比如说

有人喜欢玩艾斯爱慕,那他喜欢的就是这一类人,而不是某个人

正则表达式在JS中的使用场景

验证表单:用户表单只能输入英文字母、数字或者下划线,昵称输入框中可以输入中文匹配

可以过滤到页面中的一些敏感词(替换),或者从字符串中获取我们想要的特定部分

语法

我们想要根据规则去查找,如果找到就返回

正则同样的规则:

定义规则、查找

javascript 复制代码
let str = 'S,M,艾斯爱慕'

JS中定义正则表达式的语法有两种,我们先学习其中比较简单的方法

javascript 复制代码
count 变量名 = /表达式/

//是正则表达式字面量

我们这样判断是否有符合规则的字符串

test()方法可以查看正则表达式与指定的字符串是否匹配

javascript 复制代码
regObj.test(被检测的字符串)

这是使用实例:

html 复制代码
<!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>
    <script>
        const str = 'SM,S,M,艾斯爱慕'
        const reg = /M/
        console.log(reg.test(str))      //true
    </script>
</body>
</html>

还有一个方法:exec()方法在一个指定字符串中执行一个搜索匹配

语法:

javascript 复制代码
regObj.exec(被检测字符串)
html 复制代码
<!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>
    <script>
        const str = 'SM,S,M,艾斯爱慕'
        const reg = /M/
        console.log(reg.exec(str))      //true
    </script>
</body>
</html>

如果匹配成功,exec()方法返回一个数组,否则返回null

元字符

什么是元字符?

使用元字符有什么好处?

大多数的字符仅能够描述它们本身,这些字符称作普通字符,比如所有的字母和数字

普通字符只能够匹配字符串中与他们相同的字符

元字符是一些有特殊含义的字符,提高了灵活性和强大的匹配功能

比如:规定用户只能输入英文26个字母

元字符写法:[a-z]

参考文档:

html 复制代码
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

正则测试工具:

在线正则表达式测试OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具,提供jsbin在线 CSS、JS 调试,在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器,MarkDown编译器等其他在线工具http://tool.oschina.net/regex

为了方便记忆和学习,元字符有这样的分类:

来看看边界符:是正则表达式中用来提示字符所处的位置,主要有两个字符

如果 ^ 和 $ 在一起,表示必须是精确匹配(孩子们这不是makefile吗)

正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符

这就是边界符,来看看量词:

量词是表示重复次数

用来设定某个模式出现的次数

逗号左右两侧千万不要出现空格

简洁记法:

字符类

\]匹配字符集合 后面的字符串只要包含abc中任意一个字符都返回true ![](https://i-blog.csdnimg.cn/direct/1128b643693d44c98355232304f4ff33.png) \[ \] 里面加上 - 连字符,使用连字符 - 表示一个范围 ![](https://i-blog.csdnimg.cn/direct/32062b7639194af786e109a023923930.png) 比如: ![](https://i-blog.csdnimg.cn/direct/eb3b2a5d3a7c4c9f93656f1880567c92.png) 综合示例: ![](https://i-blog.csdnimg.cn/direct/ec4945f9f50247d888cae38759a6017e.png) 来看看字符类的: \[ \] 里面加上 \^ 取反符号 比如: \[\^a-z\] 匹配除了小写字母以外的字符 注意要写到中括号里面 . 表示匹配除换行符之外的任何单个字符 ![](https://i-blog.csdnimg.cn/direct/ef940f93c09b4a1abe75040d1499c107.png) ###### 用户名验证案例 需求: ![](https://i-blog.csdnimg.cn/direct/79485d793740455fb9afa95275463ced.png) nextElementSibling是获取下一个兄弟元素(边学边忘) ```html Document ``` ###### 昵称案例 我们需要要求用户只能输入中文: ![](https://i-blog.csdnimg.cn/direct/1efaf188c81a46a0b255c0b693b6004d.png) ```html Document ``` 预定义:指的是某些常见模式的简写方法 ![](https://i-blog.csdnimg.cn/direct/f8c6f62ada554f4e89d97f0fe5bc3896.png) ![](https://i-blog.csdnimg.cn/direct/ce220a3b6a3b4a9c89ebc3f11b8492ba.png) 就像是,记得的时候用不上,用上的时候已经忘 ##### 修饰符 修饰符约束正则执行的某些细节行为,比如是否区分大小写,是否支持多行匹配等 语法: ```html /表达式/修饰符 ``` i 是单词 ignore 的缩写,正则匹配时字母不区分大小写 g 是单词 global 的缩写,匹配所有满足正则表达式的结果 ![](https://i-blog.csdnimg.cn/direct/2f280ee099c048ea820628085ec7b6d0.png) 替换replace: ```javascript 字符串.replace(/正则表达式/,'替换的文本') ``` 过滤敏感字(不是,前端都在干些什么得罪人的活,广告跳转,多少秒之后才关闭,屏蔽敏感字。。。步道乐跑我恨你) ![](https://i-blog.csdnimg.cn/direct/c3b824164cad4888afcc83fa6148ab21.png) ```html Document

``` ![](https://i-blog.csdnimg.cn/direct/87d839bb1ec040f6aa0ee5158a96ab38.png) #### 综合案例 来仿写一个小兔仙儿的页面注册 ![](https://i-blog.csdnimg.cn/direct/d648f4a5b2914fa0b518f88bd8a946c5.png) 让我们来分析一下业务模块: ![](https://i-blog.csdnimg.cn/direct/a779fbc722e24626a3c4f1e79ccbc780.png) ###### 短信验证码 需求一: ![](https://i-blog.csdnimg.cn/direct/922d46eafa8c44718a59fc6c44360900.png) 我们需要注意的是在点击的时候如果时间未到,那应该先禁用一下点击按钮的,, 我们可以通过一个变量进行控制 ```javascript ``` ###### 验证用户名模块 需求: ![](https://i-blog.csdnimg.cn/direct/2e7783a748be42ec8526b56600ad06f6.png) ```javascript //验证的是用户名 // 获取用户表单 const username = document.querySelector('[name=username]') // 使用change事件, 值发生变化的时候 username.addEventListener('change',verifyName) // 封装函数 function verifyName(){ const span = username.nextElementSibling // 定规则 const reg = /^[a-zA-Z0-9-_]{6,10}$/ if(!reg.test(username.value)) { span.innerHTML='输入不合法,请输入6~10位' return false } // 合法的,就清空span span.innerHTML = ' ' return true } ``` ###### 验证手机号和密码框 ![](https://i-blog.csdnimg.cn/direct/5284e2387c0542f39abf9d00c56d98fc.png) 让我们来看看这个捏 ```javascript //验证码验证 // 获取手机表单 const codeInput = document.querySelector('[name=code]') // 使用change事件, 值发生变化的时候 codeInput.addEventListener('change',verifycodeInput) // 封装函数 function verifycodeInput(){ const span = codeInput.nextElementSibling // 定规则 const reg = /^\d{6}$/ if(!reg.test(codeInput.value)) { span.innerHTML='输入不合法,请输入6位数字' return false } // 合法的,就清空span span.innerHTML = ' ' return true } // 密码验证 // 获取手机表单 const password= document.querySelector('[name=password]') // 使用change事件, 值发生变化的时候 password.addEventListener('change',verifypassword) // 封装函数 function verifypassword(){ const span = password.nextElementSibling // 定规则 const reg = /^[a-zA-Z0-9-_]{6,20}$/ if(!reg.test(password.value)) { span.innerHTML='输入不合法,请输入6~20位数字,字母,符号组成的密码' return false } // 合法的,就清空span span.innerHTML = ' ' return true } // 密码再次验证 // 获取手机表单 const confirm= document.querySelector('[name=confirm]') // 使用change事件, 值发生变化的时候 confirm.addEventListener('change',verifyPwd) // 封装函数 function verifyPwd(){ const span = confirm.nextElementSibling if(confirm.value !== password.value) { span.innerHTML='输入不一致' return false } // 合法的,就清空span span.innerHTML = ' ' return true } ``` ###### 我同意和提交模块 接下来做我同意模块,又想到了。。。流氓软件 ![](https://i-blog.csdnimg.cn/direct/2693ae21c6ea4715a644ff447e532d36.png) ```javascript //我同意模块 const agree = document.querySelector('.icon-queren') agree.addEventListener('click',function(){ //切换类 原有的就删掉,没有就添加 this.classList.toggle('icon-queren2') }) ``` ![](https://i-blog.csdnimg.cn/direct/98b1b3a3f7e147f982d7b13c897d3521.png) ```javascript //提交模块 const form = document.querySelector('form') form.addEventListener('submit',function(e){ //判断是否勾选我同意模块,如果有就证明勾选了,没有就是没有 if(!agree.classList.contains('icon-queren2')){ return alert('请勾选同意协议') // 阻止提交 e.preventDefault() } // 依次判断上面的每个框框,是否通过,只有一个没通过的就阻止 if(!verifyName()) e.preventDefault() if(!verifyPhone()) e.preventDefault() if(!verifyPwd()) e.preventDefault() if(!verifycodeInput()) e.preventDefault() if(!verifypassword()) e.preventDefault() }) ``` 全部代码: ```html 小兔鲜儿 - 新鲜 惠民 快捷!

新用户注册

已阅读并同意《用户服务协议》
``` #### 阶段案例 ![](https://i-blog.csdnimg.cn/direct/58773f87f1234d0cba39b5bf110754f3.jpeg) ##### 登录页面 我们还要实现的是登录页面,先来实现tab栏切换 ![](https://i-blog.csdnimg.cn/direct/dbd2fe5f3250472f856be0d2f821f91f.png) ```javascript // 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 tab_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' } }) ``` 然后来做点击登录可以跳转页面 ```javascript // 点击提交模块 const form = document.querySelector('form') const agree = document.querySelector('[name=agree]') const username = document.querySelector('[name=username]') form.addEventListener('submit',function(e){ e.preventDefault() if(!agree.checked) { return alert('请勾选同意协议') } // 记录用户名到本地存储(没有后台数据) localStorage.setItem('xtx-uname',username.value) //跳转到首页 location.href = './index.html' }) ``` 全部代码: ```html 小兔鲜儿 - 新鲜 惠民 快捷! ``` ##### 首页页面 需求: 从登录页面跳转过来之后,自动显示用户名 如果点击退出,则不显示用户名 ![](https://i-blog.csdnimg.cn/direct/b35dfcbd56bf4f63a992ca10b9bbf6ab.png) 一些东西: ```javascript ``` 所有代码: ```html 小兔鲜儿 - 新鲜 惠民 快捷!

热门品牌国际经典 品质保证

```

相关推荐
程序猿_极客7 分钟前
【期末网页设计作业】HTML+CSS+JS 旅行社网站、旅游主题设计与实现(附源码)
javascript·css·html·课程设计·期末网页设计
百***359412 分钟前
如何在树莓派部署Nginx并实现无公网ip远程访问内网制作的web网站
前端·tcp/ip·nginx
7澄113 分钟前
Java 实战:投票统计系统(HashMap 应用)
java·开发语言·intellij-idea·交互·控制台·hashmap
zzzsde13 分钟前
【C++】红黑树:使用及实现
开发语言·c++·算法
用户2832096793715 分钟前
为什么我的页面布局总是乱糟糟?可能是浮动和BFC在作怪!
javascript
点云SLAM17 分钟前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
花果山总钻风18 分钟前
Chrome 插件框架 Plasmo 基本使用示例
前端·chrome
资讯第一线19 分钟前
《Chrome》 [142.0.7444.60][绿色便携版] 下载
前端·chrome
枫子有风22 分钟前
【go.sixue.work】2.2 面向对象:接口与多态
开发语言·后端·golang·xcode
会篮球的程序猿32 分钟前
原生表格文本过长展示问题,参考layui长文本,点击出现文本域
前端·javascript·layui