正则表达式的标识符
标识符是写在正则表达式的外面, 用来修饰整个正则表达式的
标识符
1. i 忽略大小写
/ /1. i 忽略大小写
const reg = /^[abcd]*$/;
console.log(reg.test('abcdacbd'));
console.log(reg.test('abcdA'));
复制代码
2. g 全局
匹配和捕获的时候, 都是只能找到第一个
当他有全局标识符的时候, 你捕获第二次会从第一次的结束位开始查找
知道找不到了, 返回 null
再后面依次的时候, 又回到 [0] 位置开始捕获
匹配和捕获都是影响下一次开始位的
const str = 'abc123abc456abc789abc'
const reg = /\d{3}/g
console.log(reg.exec(str)) // 结束位是 [5]
console.log(reg.exec(str)) // 开始位就是 [6]
console.log(reg.test(str)) // 开始位就是 [12]
复制代码
3. y 粘性全局
使用方法:
/abcd/igy
new RegExp('abcd', 'igy')
const str = '123456abc789abc'
const reg = /\d{3}/y
console.log(reg.exec(str)) // g 123
console.log(reg.exec(str)) // g 456
复制代码
两种创建正则表达式的区别
1. 字面量创建
使用方法: var reg = /abcd/igy
不能进行字符串拼接
书写基础元字符的时候直接写 \xx
// 1. 进行字符串拼接
var str = 'hello'
// 字符串拼接完毕就变成了字符串, 不是正则, 不能使用 test 和 exec 方法
var reg = '/' + str + '/'
console.log(reg.test())
// 因为 RegExp 的第一个参数就是传递一个字符串类型
var reg = new RegExp(str + ' world')
console.log(reg)
复制代码
2. 内置构造函数创建
+ 语法: var reg = new RegExp('abcd', 'igy')
+ 可以进行字符串拼接
+ 书写基础元字符的时候要书写 \\xx
// 2. 书写基础元字符
var reg = /\d\s\w/
console.log(reg)
var reg = new RegExp('\\s\\d\\w')
console.log(reg)
复制代码
3.字符串
字符串里面也有转义符号
是 \(反斜杠)
书写 n 的时候, 就表示文本 n
书写 \n 的时候, 就表示换行的意思
字符串里面书写 \s 的时候, 他会把 s 转换成有意义的内容
但是 \s 确实没有实际意义
变成了一个普通 s 文本
当你再字符串里面书写 \ 的时候, 表示转义符号
但是当你书写 \\ 的时候, 表示一个 \ 文本
4.字符串和正则合作的方法
都是字符串的常用方法, 只不过参数位置可以写正则
1. search()
使用方法:
1. 字符串.search(字符串片段)
2. 字符串.search(正则表达式)
返回值:
如果有就是对应的索引
如果没有就是 -1
// 1. search
const str = 'sada123sjdk'
console.log(str.search('123'))
console.log(str.search(/\d{3}/))
复制代码
2. replace()
使用方法:
1. 字符串.replace(字符串片段, 要替换的内容)
2. 字符串.replace(正则表达式, 要替换的内容)
返回值:
1. 只能替换第一个查找到的内容, 返回替换好的字符串
2. 没有全局标识符 g 的时候, 只能替换第一个查找到的内容, 返回替换好的字符串
有全局标识符 g 的时候, 会把字符串内所有满足正则规则的内容全部替换, 返回替换好的字符串
// 2. replace()
const str = 'abcd123abcd123abcd123abcd';
console.log(str.replace('123', '**'));
console.log(str.replace(/\d{3}/, '**'));
console.log(str.replace(/\d{3}/g, '**'));
复制代码
3. match()
语法:
1. 字符串.match(字符串片段)
2. 字符串.match(正则表达式)
返回值:
1. 查找到字符串内一个满足字符串片段的内容返回, 返回格式和 exec 一模一样
2. 当正则表达式没有全局标识符 g 的时候, 返回值和 exec 方法一模一样
当正则表达式有全局标识符 g 的时候, 返回一个数组, 里面是所有满足条件的内容
// 3. match()
const str = 'hello 你好 world hello 世界 world hello 我不好 world hello 还行 world'
console.log(str.match('你好'))
console.log(str.match(/你好/))
console.log(str.match(/[\u4e00-\u9fa5]+/g))
复制代码
表单验证
需求:
随着用户输入, 随时进行表单验证
文本框最右边有一个字体图标, 对勾或者叉子
当用户输入的满足条件时, 显示对勾, 不满足条件时显示叉子
假定用户名规则 非下划线开头, 只能由数字字母下划线组成, 6 ~ 12 位
有一段文本提示, 当不满足要求的时候, 显示出文本内容
实现原理
1. 获取 input 文本框绑定事件
input 事件, 因为要随着输入随时验证
2. 随时拿到用户输入的内容进行正则验证
//引入图标
<link rel="stylesheet" href="//at.alicdn.com/t/font_2035193_jb4j6bvdrw.css">
//CSS 部分
* {
margin: 0;
padding: 0;
}
form {
width: 500px;
padding: 20px;
border: 3px solid pink;
border-radius: 15px;
margin: 30px auto;
}
form > label {
position: relative;
width: 100%;
height: 30px;
display: block;
padding: 10px 0 20px;
}
form > label > span {
position: absolute;
left: 10px;
bottom: 5px;
font-size: 12px;
color: red;
display: none;
}
form > label > span.error {
display: block;
}
form > label > i {
position: absolute;
left: 250px;
width: 20px;
height: 20px;
}
form > label > i.icon-cuowu {
color: red;
}
form > label > i.icon-zhengque {
color: green;
}
//HTML 部分
<form>
<label>
用户名: <input type="text">
<!-- <i class="iconfont icon-cuowu"></i> -->
<i class="iconfont"></i>
<span>只能由数字字母下划线组成, 6 ~ 12 位, 不能以 _ 开头</span>
</label>
</form>
复制代码
// 0. 准备正则
const reg = /^[0-9a-zA-Z]\w{5,11}$/
let timer = 0
const i = document.querySelector('i')
const span = document.querySelector('span')
// 1. 获取元素绑定事件
const inp = document.querySelector('input')
inp.addEventListener('input', function () {
clearTimeout(timer)
timer = setTimeout(() => {
// 2. 随时进行正则验证
if (reg.test(this.value)) {
// 对勾显示
i.classList.add('icon-zhengque')
i.classList.remove('icon-cuowu')
span.classList.remove('error')
} else {
// 叉子 和 文本显示
i.classList.add('icon-cuowu')
i.classList.remove('icon-zhengque')
span.classList.add('error')
}
}, 300)
})
复制代码
评论