主页 > 电脑硬件  > 

【JavaScript】正则表达式综合案例

【JavaScript】正则表达式综合案例

目录

1、正则表达式

1.1 什么是正则表达式

1.2 语法

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

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

1.3 元字符

1. 边界符

2. 量词

3. 字符类:

案例    用户名验证案例

1.4 修饰符

案例   过滤敏感字

综合案例   小兔鲜页面注册

步骤:

JavaScript: 

小兔鲜登录页面

小兔鲜首页页面

总结一下~本章对我的收获很大,希望对你也是!!!!


本章节所有素材自取:刘一豪hhh/JavaScript学习之路 - Gitee

1、正则表达式 1.1 什么是正则表达式 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象 通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式

正则表达式在 JavaScript中的使用场景: Ø 例如验证表单:用户名表单只能输入英文字母、数字或者下划线, 昵称输入框中可以输入中文( 匹配 ) Ø 比如用户名: /^[a-z0-9_-]{3,16}$/ Ø 过滤掉页面内容中的一些敏感词( 替换 ),或从字符串中获取我们想要的特定部分( 提取 )等 。

1.2 语法 我们想要查找是否有戴眼镜的人, 怎么做呢? 1. 定义规则: 戴眼镜的 2. 根据规则去查找:找到则返回 正则同样道理,我们分为两步: 1. 定义规则 2. 查找 比如:查找下面文本中是否包含字符串 '前端' let str = '前端开发培训,web前端培训,软件测试培训,产品经理培训'

1. 定义正则表达式语法: 2.判断是否有符合规则的字符串: test() 方法 用来查看正则表达式与指定的字符串是否匹配

3.检索(查找)符合规则的字符串: exec() 方法 在一个指定字符串中执行一个搜索匹配

1.3 元字符 普通字符: 大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。 也就是说普通字符只能够匹配字符串中与它们相同的字符。 元字符(特殊字符) 是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。 Ø 比如,规定用户只能输入英文26个英文字母,普通字符的话 abcdefghijklm….. Ø 但是换成元字符写法: [a-z] 参考文档: Ø MDN: developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions Ø 正则测试工具: http://tool.oschina.net/regex

为了方便记忆和学习,我们对众多的元字符进行了分类: Ø 边界符(表示位置,开头和结尾,必须用什么开头,用什么结尾) Ø 量词 (表示重复次数) Ø 字符类 (比如 \d 表示 0~9)

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

如果 ^ 和 $ 在一起,表示必须是精确匹配

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

2. 量词 量词用来 设定某个模式出现的次数

<script> // 元字符 console.log(/哈/.test('哈')) //true console.log(/哈/.test('哈哈')) //true console.log(/哈/.test('二哈')) //true // 1. 边界符 console.log(/^哈/.test('哈')) //true console.log(/^哈/.test('哈哈')) //true console.log(/^哈/.test('二哈')) //false console.log(/^哈$/.test('哈')) //true console.log(/^哈$/.test('哈哈')) //false ^ & 精确匹配 必须要一模一样 console.log(/^哈$/.test('二哈')) //false ^ & 精确匹配 必须要一模一样 console.log('---------------------------------') // 量词 * 类似 >= 0次 console.log(/^哈$/.test('哈')) //true console.log(/^哈*$/.test('')) //true console.log(/^哈*$/.test('哈')) //true console.log(/^哈*$/.test('哈哈哈')) //true console.log(/^哈*$/.test('二哈很傻')) //false console.log(/^哈*$/.test('哈很傻')) //false console.log(/^哈*$/.test('哈很傻')) //false console.log('---------------------------------') // 量词 + 类似 >= 1次 console.log(/^哈$/.test('哈')) //true console.log(/^哈+$/.test('')) //false console.log(/^哈+$/.test('哈')) //true console.log(/^哈+$/.test('哈哈哈')) //true console.log(/^哈+$/.test('二哈很傻')) //false console.log(/^哈+$/.test('哈很傻')) //false console.log(/^哈+$/.test('哈很傻')) //false console.log('---------------------------------') // 量词 ? 类似 0 || 1次 console.log(/^哈$/.test('哈')) //true console.log(/^哈?$/.test('')) //true console.log(/^哈?$/.test('哈')) //true console.log(/^哈?$/.test('哈哈哈')) //false console.log(/^哈?$/.test('二哈很傻')) //false console.log(/^哈?$/.test('哈很傻')) //false console.log(/^哈?$/.test('哈很傻')) //false console.log('---------------------------------') // 量词{n} 写几 就必须出现几次 console.log(/^哈{4}$/.test('哈哈哈哈')) //true console.log(/^哈{4}$/.test('哈哈哈')) //false console.log('---------------------------------') // 量词{n,} 必须要>= n console.log(/^哈{4,}$/.test('哈哈哈')) //false console.log(/^哈{4,}$/.test('哈哈哈哈')) //true console.log(/^哈{4,}$/.test('哈哈哈哈哈哈')) //true console.log('---------------------------------') // 量词{n,m} 逗号两侧千万不能有空格 >= n && <= m console.log(/^哈{4,6}$/.test('哈哈哈')) //false console.log(/^哈{4,6}$/.test('哈哈哈哈')) //true console.log(/^哈{4,6}$/.test('哈哈哈哈哈哈')) //true console.log(/^哈{4,6}$/.test('哈哈哈哈哈哈哈')) //false console.log(/^哈{4,6}$/.test('哈哈哈哈哈哈哈哈')) //false console.log('---------------------------------') </script>

3. 字符类: (1) [ ] 匹配字符集合 后面的字符串只要包含 abc 中任意 一个字符 ,都返回 true 。 比如: Ø [a-z] 表示 a 到 z 26个英文字母都可以 Ø [a-zA-Z] 表示大小写都可以 Ø [0-9] 表示 0~9 的数字都可以 //字符类 [abc] 只选一个 console.log(/^[abc]$/.test('a')) //true console.log(/^[abc]$/.test('b')) //true console.log(/^[abc]$/.test('c')) //true console.log(/^[abc]$/.test('ab')) //false console.log(/^[abc]{2}$/.test('ab')) //true 量词 console.log('---------------------------------') // 字符类 [a-z] 只选一个 console.log(/^[A-Z]$/.test('p')) //false console.log(/^[A-Z]$/.test('P')) //true console.log(/^[0-9]$/.test('2')) //true console.log(/^[0-9A-Z0-9]$/.test('2')) //true console.log(/^[0-9A-Z0-9]$/.test('P')) //true

(1) [ ] 里面加上 ^ 取反符号 比如: Ø [^a-z] 匹配除了小写字母以外的字符 Ø 注意要写到中括号里面

(2) . 匹配除换行符之外的任何单个字符

总结:

1. 字符类 . (点)代表什么意思? Ø 匹配除换行符之外的任何单个字符 2. 字符类 [] 有若干代表什么意思? Ø [abc] 匹配abc其中的任何单个字符 Ø [a-z] 匹配26个小写英文字母其中的任何单个字符 Ø [^a-z] 匹配除了26个小写英文字母之外的其他任何 单个字符

案例    用户名验证案例 需求:用户名要求用户英文字母,数字,下划线或者短横线组成,并且用户名长度为 6~16位 分析: ①:首先准备好这种正则表达式模式 /^[a-zA-Z0-9-_]{6,16}$/ ②:当表单失去焦点就开始验证. ③:如果符合正则规范, 则让后面的span标签添加 right 类. ④:如果不符合正则规范, 则让后面的span标签添加 wrong 类 const reg = /^[a-z0-9A-Z-_]{4,16}$/ const input = document.querySelector('input') const span = input.nextElementSibling // console.log(span) input.addEventListener('blur', function () { if (reg.test(this.value)) { span.innerHTML = '输入正确' span.className = 'right' } else { span.innerHTML = '输入错误,请输入4-16位数字或字符' span.className = 'error' } }) (3) 预定义:指的是 某些常见模式的简写方式。

1.4 修饰符 修饰符约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等 语法: 替换 replace 替换:

Ø i 是单词 ignore 的缩写,正则匹配时字母不区分大小写 Ø g 是单词 global 的缩写,匹配所有满足正则表达式的结果

案例   过滤敏感字 需求:要求用户不能输入敏感字 比如,pink老师上课很有** 分析: ①:用户输入内容 ②:内容进行正则替换查找,找到敏感词,进行** ③:要全局替换使用修饰符 g

综合案例   小兔鲜页面注册

素材自取​​​​​​​

分析业务模块: ①: 发送验证码模块 ②: 各个表单验证模块 ③: 勾选已经阅读同意模块 ④: 下一步验证全部模块 只要上面有一个input验证不通过就不同意提交

步骤: 需求①: 发送验证码         用户点击之后,显示 05秒后重新获取         时间到了,自动改为 重新获取 需求②: 用户名验证(注意封装函数 verifyxxx ) , 失去焦点触发这个函数         正则 /^[a-zA-Z0-9-_]{6,10}$/         如果不符合要求,则出现提示信息 并 return false 中断程序         否则 则返回return true                 之所以返回 布尔值,是为了 最后的提交按钮做准备                 侦听使用change事件,当鼠标离开了表单,并且表单值发生了变化时触发(类似京东效果) 需求③: 手机号验证         正则: /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$/         其余同上 需求④: 验证码验证         正则 /^\d{6}$/         其余同上 需求⑤: 密码验证         正则 /^[a-zA-Z0-9-_]{6,20}$/         其余同上 需求⑥: 再次密码验证         如果本次密码不等于上面输入的密码则返回错误信息         其余同上 需求⑦: 我同意模块         添加类 .icon-queren2 则是默认选中样式 可以使用 toggle切换类 需求⑧: 表单提交模块         使用 submit 提交事件         如果没有勾选同意协议,则提示 需要勾选         classList.contains() 看看有没有包含某个类,如果有则返回true,么有则返回false         如果上面input表单 只要有模块,返回的是 false 则 阻止提交 JavaScript:  <script> const code = document.querySelector('.code') let flag = true code.addEventListener('click', function () { if (flag) { flag = false let i = 5 code.innerHTML = `0${i}秒后重试` let timerId = setInterval(function () { i-- code.innerHTML = `0${i}秒后重试` if (i === 0) { clearInterval(timerId) code.innerHTML = '重新获取' flag = true } }, 1000) } }) // 验证用户名 const username = document.querySelector('[name=username]') // 使用change事件 值发生变化的时候 username.addEventListener('change', usernameInfo) function usernameInfo() { const span = username.nextElementSibling const reg = /^[0-9a-zA-Z]{6,10}$/ console.log(username.value) if (!reg.test(username.value)) { span.innerHTML = '输入不符合规范,请输入6~10位' return false } span.innerHTML = '' return true } // console.log(usernameInfo()) // 验证手机号 // 获取手机表单 const phone = document.querySelector('[name=phone]') // 使用change事件 值发生变化的时候 phone.addEventListener('change', phoneInfo) function phoneInfo() { const span = phone.nextElementSibling const reg = /^[0-9]{11}$/ // console.log(this.value) if (!reg.test(phone.value)) { span.innerHTML = '输入不符合规范,请输入11位' return false } span.innerHTML = '' return true } // 获取验证码 const codeInput = document.querySelector('[name=code]') // 使用change事件 值发生变化的时候 codeInput.addEventListener('change', codeInputInfo) function codeInputInfo() { const span = codeInput.nextElementSibling const reg = /^[0-9]{6}$/ // console.log(this.value) if (!reg.test(codeInput.value)) { span.innerHTML = '输入不符合规范,请输入6位' return false } span.innerHTML = '' return true } // 设置密码 const password = document.querySelector('[name=password]') // 使用change事件 值发生变化的时候 password.addEventListener('change', passwordInfo) function passwordInfo() { const span = password.nextElementSibling const reg = /^[0-9a-zA-Z]{6,20}$/ // console.log(this.value) if (!reg.test(password.value)) { span.innerHTML = '输入不符合规范,请输入6~20位' return false } span.innerHTML = '' return true } // 密码的再次验证 const confirm = document.querySelector('[name=confirm]') // 使用change事件 值发生变化的时候 confirm.addEventListener('change', confirmInfo) function confirmInfo() { const span = confirm.nextElementSibling // console.log(this.value) if (confirm.value !== password.value) { span.innerHTML = '输入不符合规范' return false } span.innerHTML = '' return true } // 同意 const queren = document.querySelector('.icon-queren') queren.addEventListener('click', function () { this.classList.toggle('icon-queren2') }) // console.log(usernameInfo()) // console.log(phoneInfo()) // console.log(codeInputInfo()) // console.log(passwordInfo()) // console.log(confirmInfo()) // 提交模块 const form = document.querySelector('form') form.addEventListener('submit', function (e) { if (!queren.classList.contains('icon-queren2')) { alert('请勾选同意协议') e.preventDefault() } else if (!usernameInfo() || !phoneInfo() || !codeInputInfo() || !passwordInfo() || !confirmInfo()) { alert('表格没有完成或输入有误') e.preventDefault() } }) </script>

小兔鲜登录页面

需求: ①: tab切换 需求②: 点击登录可以跳转页面 Ø 先阻止默认行为 Ø 如果没有勾选同意,则提示要勾选 Ø required 属性不能为空 Ø 假设登录成功 把用户名记录到本地存储中 同时跳转到首页 location.href

required 非空字段,input表单提交更加方便,有空就不允许提交

checked 通常用于复选框 (<input type="checkbox">) 或单选按钮 (<input type="radio">) 来检查它们是否被选中。

JavaScript: 

const nav = document.querySelector('.tab-nav') const pane = document.querySelectorAll('.tab-pane') nav.addEventListener('click', function (e) { // console.log(e.target.tagName) if (e.target.tagName === 'A') { nav.querySelector('.active').classList.remove('active') e.target.classList.add('active') for (let i = 0; i < pane.length; i++) { pane[i].style.display = 'none' } pane[e.target.dataset.id].style.display = 'block' } }) // 点击提交模块 const username = document.querySelector('[name=username]') const password = document.querySelector('[name=password]') const agree = document.querySelector('[name=agree]') const info = document.querySelector('.info') info.addEventListener('submit', function (e) { e.preventDefault() // console.log(agree.checked) if (!agree.checked) return alert('请勾选同意协议') //用户名存入本地 localStorage.setItem('xtx-uname', username.value) //跳转到首页 location.href = './index.html' })

小兔鲜首页页面 步骤: ④: 点击 退出登录 删除本地存储对应的用户名数据 重新调用渲染函数即可

需求: 如果是移动端打开,则跳转到移动端页面 如果本地存储有数据,则 显示 你好 xxxx 否则 显示 请跳转到注册页面 //获取第一个li const li1 = document.querySelector('.xtx_navs li:nth-child(1)') // console.log(li1) const li2 = li1.nextElementSibling // console.log(li2) // 构造一个渲染函数 function render() { //获取本地存储的用户名 const uname = localStorage.getItem('xtx-uname') // console.log(uname) if (uname) { li1.innerHTML = `<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.html">免费注册</a>' } } render() // 点击退出登录模块 li2.addEventListener('click', function () { //删除本地存储数据 localStorage.removeItem('xtx-uname') //重新渲染 render() })

总结一下~本章对我的收获很大,希望对你也是!!!!

标签:

【JavaScript】正则表达式综合案例由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【JavaScript】正则表达式综合案例