正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
js里的正则表达是通常是 new RegExp(),对象创建,或者直接用字面量 /【表达式】/ 来表示 (两个斜线/中间包含匹配规则)
【【先上干货,方便查找】】

未标题-1.png
基础知识
匹配普通字符
1.例如匹配 字母a 可以直接写/a/ ,匹配abc 可以直接写作/abc/
2.匹配子集,可以使用[]中括号来表示,例如匹配a或b或c 可以写作 [abc] ,如果匹配所有小写字母可以写作[a-z]。如果是不匹配abc中的任何一个可以写作[^abc],中括号里^表示 非
3.匹配集符号, 一些约定的匹配固定类型字符的集合表达式,例如匹配空白字符(包括空格,换行制表符等)可以用 s , 表达是写做/s/

image.png

image.png
4.特殊字符。一些字符在表达式里有特殊的意义,比如^ 表示匹配字符串开始,+表示一个或者多个;这类字符如果需要直接匹配字符本身的话,需要加转义, 比如+

image.png
5.限定符:限定符主要用来控制匹配次数,比如匹配a五次 可以携程 /a{5}/ ,出现少于5次的a都不会被匹配。不写限定符的话默认就是匹配一个
【限定符+和*都是贪婪的,也就是说会尽可能多的去匹配,在后边加上?就可以改成非贪婪的,就是尽可能少的满足条件的字符串】

image.png
6.定位符: 确定匹配字符串出现的位置,比如^匹配字符串开始,$匹配字符串结尾

image.png
7.修饰符: 也叫标示,正则表达式用于指定额外的匹配方式(策略)

image.png
8.分组、引用 和 捕获: 用()将表达式包起来,那么如果匹配成功,被匹配的字符串就会被单独提取出来
***直接匹配的结果会被放到匹配结果的key=0位置,有分组的是从1开始按顺序排列,有命名的会被放到groups里,key就是自定义的命名***
**这就叫分组,分组的内容会被捕获到匹配结果里。分组可以被引用,也可以命名并引用**
分组引用:
/([abc]{5})[0-8]1/ // 可以用 斜杠加数字(分组出现顺序排列),来引用之前分组匹配到的字符
命名分组:
let reg2 = /(?[abc]{5})[0-9]+a/
let res1 = reg2.exec('abcab98809abcab')
console.log(res1) // {0: "abcab98809a",1: "abcab",groups: {a: "abcab"},index: 0,input: "abcab98809abcab",length: 2 }
// 有命名的分组会出现在groups里,可以通过自定义的名字找到相应匹配结果
例如:
var str1 = '1234596absdkfjk544asdfkadsfk'
var reg1 = /([1-9]{2})[a-z]+/g
var res1 = str1.match(reg1) // 也可以用reg1.exec(str1) 前者是字符串的方法,后者是正则对象的方法
console.log(res1) // ['96absdkfjk', '44asdfkadsfk']
var res2 = reg1.exec(str1) // 匹配到第一个就会结束,下次调用从第一个匹配结束的索引开始匹配
console.log(res2) // ["96absdkfjk", "96", index: 5, input: "1234596absdkfjk544asdfkadsfk", groups: undefined]
var reg2 = /([1-9]){2}[a-z]+/
var res3 = str1.match(reg2)
console.log(res3) // ["96absdkfjk", "6", index: 5, input: "1234596absdkfjk544asdfkadsfk", groups: undefined]
// 此时没有全局匹配标示符g,只匹配第一个然后就结束
*运算符优先级*

image.png
易错点
书写格式问题,正则表达式的规则比较严格,不要有空格或者换行等多余字符,否则可能不会执行
例如:现在js习惯,会同城在 逗号 ,后加空格 /[0-9]{3, 5}/ 乍一看,没什么问题。但是它不会执行,因为3,后边有个空格.所以正则表达式不会正常执行,并且总是返回false。
先行断言或者后行断言是并列的,不是串行的
例如: /(?=a)(?=b)2/ 匹配a2或者b2
/(?!a)(?!b)2/ 意思是不匹配 a2 并且不匹配b2
常用正则表达式 (持续更新)
// 电话
let phone = /^1[3-9][0-9]{9}$/
// 邮箱
let email = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/
// 身份证
let idCard = /^$|^[1-9][0-9]{15,17}[xX]?$/
// 匹配年份
let treg = /^$|^[12]{1}[0-9]{3}$/
// 匹配月份
treg = /^$|^0?[1-9]$|^1[0-2]{1}$/
// 匹配日
treg = /^$|^0?[1-9]$|[12][0-9]$|^3[01]$/
// 复杂密码 8-20位 必须包含数字,字母 和特殊符号(~!@#$%^&*(){}[]|-+)
let password = /^(?!d+$)(?![a-zA-Z]+$)(?![a-zA-Z0-9]+$)(?![0-9*/-+.\{}[]()&|^%$#@!~]+$)(?![a-zA-Z*/-+.\{}[]()&|^%$#@!~]+$)[0-9a-zA-Z*/-+.\{}[]()&|^%$#@!~]{8,20}$/
// 匹配汉字
let word = [u4e00-u9fa5]
// 爬虫常用,获取图片路径
let img = /
/