前言
正则表达式是用来处理字符串的,它可以让你节省很多很多的代码,例如:
如果一个输入框不让提交,这个过程就是表单验证的过程。同理:
- 如果我们输入的不是手机号,就不让提交
- 如果我们输入的不是邮箱地址,就不让提交
- 如果我们输入的不是身份证号,不然提交
上面这些操作都是表单验证的场景,而这些都需要用到正则表达式
正则的使用
想要创建一个正则表达式,需要我们通过new RegExp
进行创建。也可以通过//
,建议使用后者,在特定时候,必须使用前者
let reg = new RegExp("规则", "修饰符")
let reg = /规则/修饰符
验证字符串是否符合正则表达式
reg.test(字符串) // 返回值为true或者false
宽度
正则表达式中一个字符是一个宽度,会和字符串中的对应的符合条件的字符尽心匹配,如:
let reg = /a/
let str = "sva"
// reg就会匹配到a
let reg = /aa/
let str = 'svab'
// 这个不能匹配
如果我们要匹配的内容是一个范围
使用[]
表示一个范围,宽度为1
let reg = /[abcdefghjklmnopqrstuvwxyz]/ // 虽然有26个字母,但是只匹配一个宽度
let reg = /[a-z]/ // 如果式连贯的字母,就可以写a-xxx 如a-c表示 abc
let reg = /[a-zA-Z]/
let reg = /[a-cA-C_0-4]/
如果表示不包含[]中的内容
/[^a-c]/ // 不包含a-c
以什么开始 以什么结束
为了确保我们匹配到的字符是一个完整没有其他不符合要求的字符,一般我们需要设置开始和结束的标志
let reg = /^规则/
let reg = /规则$/
let reg = /^规则$/
将匹配宽度增加
在我们进行匹配时,有很多时候会出现相同匹配情况,我们可以设置匹配宽度 {m, n}
例如:
QQ号是5-11位
let qqReg = /^[1-9][0-9]{4,10}$/
数量可以有以下写法
{m, n} // m - n位
{m} // 固定m位
{m,} // 大于等于m位
\ 转义符
我们正则表达式中,有些字符有自己的功能,我们就需要通过转义符来实现另外一种功能,例如
- d表示字母d,\d表示数字
- w表示字母w,\w表示所有字符
- \表示转移,\\表示普通的符号\
字符大写
如果一个元字符中字母大写,则一般表示,小写的反义结果,例如
\d表示数字 \D 表示非数字
* + ?
- * 表示 0次或者多次 {0, }
- +表示1次或者多次 {1, }
- ? 表示0次或者1次 {0, 1}
.是除换行符外的任意字符
如果我们想要匹配标点符号.
我们需要\.
\b \B
表示单词的边界,一般你用不上,例如,我想匹配我的className
<div class="box box1 box2"></div>
\B表示非单词边界
\d \D
\d等同于[0-9] 表示数字
\D等同于[^0-9] 非数字
\n \s \S \r
\n换行符 \r回车符
\s空白符 \n \r \t \v都是空白符
\S表示非空白符
\w \W
\w字母数字下划线 等同于 [a-zA-Z0-9_]
\W表示非数字字母下划线[^a-zA-Z0-9_]
\数字
我们如果在正则表达式中有括号,会产生一个分组
let reg = /(\d)\1/g // 等同于 \d前面匹配内容的引用
let str = '112234' // 11 22
()
优先匹配 产生分组
let reg = /((1)(2))(((3))(4))/
/*
((1)(2))
(1)
(2)
(((3))(4))
((3))
(3)
(4)
*/
| 或
条件,不走前面就走后面
let reg = /((131)|(132))/
$num
在replace操作中,如果我们想要借助分组匹配到的结果,可以使用$num num就是组的序号。
let str = `
1. 题目1
2. 题目2
3. 题目3
4. 题目4
5. 题目5
6. 题目6
`
console.log(str.replace(/(题目\d)/g, "'$1'"))
贪婪和懒惰
如果在限制符后添加?
会进入懒惰模式,然后会尽可能少的取匹配对应的字符。默认是贪婪模式,尽可能多的匹配字符。
零宽断言
(?:pattern)
可以代替|
操作时,省略公共的字符
let str = `
windows10
windows11
`
let reg = /windows(?:10|11)/
// 匹配到的是windows10 和 windows11 相当于windows10|windows11
(?=pattern)
匹配后面的结尾的内容是否符合条件
let str = `
windows10
windows11
`
let reg = /windows(?=\d+)/
// 匹配到的是windows 匹配数字但是不进行保存
(?<=pattern)
和上面方向相反,先判断后匹配
let str = `
windows10
windows11
`
let reg = /(?<=windows)\d+/
// 匹配到的是后面的数字,匹配window但是不保存
(?!pattern)
和第一个都是后面判断,表示不符合条件
let str = `
windows10
windows11
windowsxp
`
let reg = /windows(?!\d+)/
// 匹配到的是windows 是windowsxp的windows 前面两个比匹配
(?<!pattern)
和上面方向相反,先判断后匹配
let str = `
windows1
windows2
ubuntu3
`
let reg = /(?<!windows)\d+/
// 匹配到的是后面的数字,但是是最后一个3,因为前面不能是windows