明确:在实战工作中,经常需要验证用户输入的数据,最典型的场景登录注册
思考:判断输入框内容是都等于空(也就是用户是否输入非常简单)但是如何判断是否是邮箱手机号呢?
回答:uname != ‘’ 得通过正则
简单概括
概念:正则由用普通字符和特殊字符组成的字符串 作用:检测是否符合规定 留心:字符就是英文、数字、下划线, 字符串一堆字符集合说明:创建正则表达式的方法有两种,分别叫:隐式创建(字面量)、直接实例化(构造函数)
说明:两种方式的构造函数都是RegExp
1、隐式创建 语法:修饰符 regexp = /正则表达式/可选修饰符
2、直接实例化 语法:修饰符 regexp = new RegExp(“正则表达式”, 可选参数)
3、参数说明
【必须】正则表达式:普通字符串、特殊字符
【可选】修饰符:i 不区分大小写、g 表示多行匹配全局匹配
test
语法:正则对象.test(待校验的数据) 作用:判断数据是否匹配 返回:匹配 -true, 不匹配 - false
<script> // 下述古诗中是否含有“锄禾日当午”? // “离离原上草,一岁一枯荣。 // 野火烧不尽,春风吹又生。 // 远芳侵古道,晴翠接荒城。 // 又送王孙去,萋萋满别情。” // 1. 创建正则对象 let regexp = /锄禾日当午/ // 包含指定内容 返回 BOOL // 2. 判断 result rs let rs = regexp.test('离离原上草,一岁一枯荣。锄禾日当午,野火烧不尽,春风吹又生。远芳侵古道,晴翠接荒城。又送王孙去,萋萋满别情。') console.log(rs) </script>exec
语法:正则对象.exec(待校验的数据)作用:匹配符合条件的数据,举例获取字符串中所有数字返回:成功 - 数组 , 失败 - null // 1. 创建正则对象 g global let regexp = /js/g // 2. 通过exec语法获取数据 // let rs = regexp.exec("js离离原上js草js,一岁一枯荣。野火烧不尽,春风吹又生js。远芳侵古道,js晴翠接荒城。又送王孙去,萋萋满别情。") let str = "js离离原上js草js,一岁一枯荣。野火烧不尽,春风吹又生js。远芳侵古道,js晴翠接荒城。又送王孙去,萋萋满别情。" // console.log(regexp.exec(str)) // js 0 // console.log(regexp.exec(str)) // js 6 // console.log(regexp.exec(str)) // js 9 // console.log(regexp.exec(str)) // js 29 // console.log(regexp.exec(str)) // js 38 // console.log(regexp.exec(str)) // 找不到 返回 null // 发现:上面写麻烦 // 解决:循环 // 明确:不知道循环次数 用 while // while (成立) { while (temp = regexp.exec(str)) { // 成立 5 最后一次 6 null、undefined、false、假 退出 // 一直成 console.log(temp) }. : 匹配非换行的任意字符
\ : 转译符号,把有意义的 符号 转换成没有意义的字符,把没有意义的字符转换成有意义的 符号\s : 匹配空白字符(空格/制表符/…)\S : 匹配非空白字符\d : 匹配数字\D : 匹配非数字\w : 匹配数字字母下划线\W : 匹配非数字字母下划线\S : 匹配非空白字符
var reg = /\s/ var str = 'a b' var str2 = 'ab' console.log(reg.test(str)) // true console.log(reg.test(str2)) // false\d : 匹配数字
var reg = /\d/ var str = 'abc1' var str2 = 'abc' console.log(reg.test(str)) // true console.log(reg.test(str2)) // false\w : 匹配数字字母下划线
var reg = /\w/ var str = 'a1' var str2 = '#@$' console.log(reg.test(str)) // true console.log(reg.test(str2)) // false* : 前一个内容重复至少 0 次,也就是可以出现 0 ~ 正无穷 次
// 下面正则表示验证数字出现 0 ~ 正无穷次都可以 var reg = /\d*/ var str = 'abc' var str2 = 'abc1' var str3 = 'abc123' console.log(reg.test(str)) // true console.log(reg.test(str2)) // true console.log(reg.test(str3)) // true+ : 前一个内容重复至少 1 次,也就是可以出现 1 ~ 正无穷 次
// 下面正则表示验证数字出现 1 ~ 正无穷次都可以 var reg = /\d+/ var str = 'abc' var str2 = 'abc1' var str3 = 'abc123' console.log(reg.test(str)) // false console.log(reg.test(str2)) // true console.log(reg.test(str3)) // true- ? : 前一个内容重复 0 或者 1 次,也就是可以出现 0 ~ 1 次
// 下面正则表示验证数字出现 0 ~ 1 次都可以 var reg = /\d?/ var str = 'abc' var str2 = 'abc1' console.log(reg.test(str)) // true console.log(reg.test(str2)) // true{n} : 前一个内容重复 n 次,也就是必须出现 n 次
// 下面正则表示验证数字必须出现 3 次 var reg = /\d{3}/ var str = 'abc' var str2 = 'abc1' var str3 = 'abc123' console.log(reg.test(str)) // false console.log(reg.test(str2)) // false console.log(reg.test(str3)) // true{n,} : 前一个内容至少出现 n 次,也就是出现 n ~ 正无穷 次
// 下面正则表示验证数字出现 3 ~ 正无穷次 var reg = /\d{3,}/ var str = 'abc' var str2 = 'abc1' var str3 = 'abc123' var str4 = 'abcd1234567' console.log(reg.test(str)) // false console.log(reg.test(str2)) // false console.log(reg.test(str3)) // true console.log(reg.test(str4)) // true{n,m} : 前一个内容至少出现 n 次至多出现 m 次,也就是出现 n ~ m 次
// 下面正则表示验证数字只能出现 3 ~ 5 次 var reg = /\d{3,5}/ var str = 'abc' var str2 = 'abc1' var str3 = 'abc123' var str4 = 'abc12345' console.log(reg.test(str)) // false console.log(reg.test(str2)) // false console.log(reg.test(str3)) // true console.log(reg.test(str4)) // true边界符是限定字符串的开始和结束的
// 下面表示从开头到结尾只能有数字,并且出现 3 ~ 5 次 var reg = /^\d{3,5}$/ var str = 'abc' var str2 = 'abc123' var str3 = '1' var str4 = '1234567' var str5 = '123' var str6 = '12345' console.log(reg.test(str)) // false console.log(reg.test(str2)) // false console.log(reg.test(str3)) // false console.log(reg.test(str4)) // false console.log(reg.test(str5)) // true console.log(reg.test(str6)) // true现在我们就可以把若干符号组合在一起使用了
// 下面是一个简单的邮箱验证 // 非_$开头,任意字符出现至少6次,一个@符号,(163|126|qq|sina)中的任意一个,一个点,(com|cn|net)中的任意一个 var reg = /^[^_$].{6,}@(163|126|qq|sina)\.(com|cn|net)$/匹配检测是否是秋秋号,规则:5~11数字,首字母不能是0
let regexp = /^[1-9]\d{4,10}$/匹配检测是否是手机号,规则:11数字,首字母不能是0
let regexp = /^1\d{10}$/匹配网站账号是否合法,规则:账号由5~12个数字、字母下划线组成,首字母不能是数字
let regexp = /^[a-zA-Z_]\w{4, 11}$/邮箱验证
//任意字符 6+ //@ //qq 163 126 //. //com cn net let regexp = /^.{6,}@(qq|163|126)\.(com|cn|net)$/ <input type="text"> <button id="btn1">检测是否是纯数字</button> <button id="btn2">输出所有数字</button> <script> // 1. 获取btn2 let btn2 = document.querySelector('#btn2') // 2. 绑定事件 btn2.addEventListener('click', function() { // 获取值 let input = document.querySelector("input") // 通过正则取出所有数字 let regexp = /\d/g // 输出 while(temp = regexp.exec(input.value)) { console.log(temp) } }) // 1. 获取btn let btn1 = document.querySelector('#btn1') // 2. 点击事件 btn1.addEventListener('click', function() { // 1. 获取 let input = document.querySelector('input') // 2. 创建正则 // let regexp = /^\d+$/ let regexp = /^\d{1,}$/ // 3. 检测 if (regexp.test(input.value)) { alert('是') } else { alert('不是') } }) </script>search(了解)
作用:获取字符串中指定内容的下标
语法:字符串.search(内容或正则)
返回:字符下标,找不到 -1
练习:
let str = 'abcdefg' console.log(str.search('a')) // 0 console.log(str.search('b')) // 1 console.log(str.search('z')) // -1 console.log(str.indexOf('a')) // 0 console.log(str.indexOf('b')) // 1 console.log(str.indexOf('z')) // -1 console.log(str.search(/\d/)) // -1 let str2 = 'sdfads8f9' console.log(str2.search(/\d/)) // 6match 作用:获取字符串中匹配的字符
语法:字符串.match(内容或正则)
返回:正则不加g则相当于exec、加了修饰符g返回纯内容数组 !!!
练习:
<script> let str = 'a1b2c3d4e5f6g' // 匹配所有数字 let regexp = /\d/g console.log(str.match(regexp)) //返回所有匹配的结果 </script>replace*** 作用:内容替换
语法:字符串.replace(旧数据或正则,新数据
返回:匹配后的数据,留心不写正则只能替换一个 写了可以全部
练习:
<script> let str = 'a1b2c3d4e5f6g' // 去掉所有数字 // str = str.replace(1, '') // console.log(str.replace(2, '')) // 正则 console.log(str.replace(/\d/g, '')) // 问:很多 数据的 说法水电 费第三方 // 解: let str2 = '很多 数据的 说法水电 费第三方' console.log(str2.replace(/ /g, ' ')) console.log(str2.replace(/ /g, '<span style="display:inline-block;margin-left:10px;"></span>')) </script>正则表达式概念
是什么:由普通字符和特殊字符组成的字符串 能干吗:1-数据验证(登录),2-数据替换(购物车),3-网络爬虫/采集
正则表达式对象语法
创建 var regexp = new RegExp(“正则表达式”, “修饰符”) var regexp = /正则表达式/修饰符 调用 test 检测数据是否匹配 true false exec 匹配正则数据 数组 null
正则符号 初体验 /内容/ 含有锄禾日当午 含有数字8 元字符(具有特殊含义的字符) 检测是否有数字 /\d/ 限定符(限定规则出现次数) 检测是否含有n个数字 /\d{n}/
边界符(限制开头和限制结尾) 检测是否完全匹配(1-个数,2-类型) 手机、用户名、邮箱 特殊符号
元字符
\w 数字、英文、下划线 \W 非 数字、英文、下划线 \d 数字 \D 非数字 \s 空格 \S 非空格 . 任意 \ 转义
限定符
至少1次 {1,} 任意次 {0,} ? 0~1 {0,1}边界符 ^ $
特殊符号 [内容] [0-9a-zA-Z] [^0-9a-zA-Z]
(a|b)$
多学一招:() 非常厉害内存里面会单独存 正则内:\数字 正则外:RegExp.$数字 替换中:字符串.replace(旧数据,’$1’)
字符串对象用正则
语法:字符串.match(正则或普通内容) 返回:正则加修改符g 则返回纯内容数组,否则和exec一样
语法:字符串.replace(正则或普通内容/g,新数据) 购物车替换非数字