正则匹配基础
正则表达式它是js内置的一个对象,它的构造函数是RegExp,可以通过构造函数或者字面量这两种方式创建正则表达式.
正则表达式的两个方法
test()方法,用于验证某个字符串是否符合这个正则表达式规则;
exec()方法,用于根据正则表达式去字符串中提取符合要求的字符;
正则表达式修饰符
g代表全局global;
i代表ignore忽略大小写;
m代表multipleline多行的意思,也就是可以换行查找;
正则表达式规则
一元符
| 元字符 |
对应说明 |
| . |
匹配除换行符之外的任意字符 |
| \w |
匹配字母数字下划线,等同于:[a-zA-Z0-9_] |
| \s |
匹配任意空白符 |
| \d |
匹配数字,等同于[0-9] |
| \b |
匹配单词边界 |
| | |
或匹配,如 /x|y/ 正则可匹配x或y两个字符 |
| ^ |
匹配字符串的开始 |
| $ |
匹配字符串的结束 |
反义字符
| 反义字符 |
对应说明 |
| [^x] |
匹配除“x”之外的所有字符,其中“x”可以为任意字符 |
| [^xyz] |
同上,匹配除“x、y、z”之外的任意字符 |
| \W |
匹配除了字母、数字、下划线之外的所有字符,等同于:[^\w] |
| \S |
匹配除空白符之外的任意字符,等同于:[^\s] |
| \B |
匹配不是单词边界的字符,等同于:[^\b] |
| \D |
匹配不是数字的所有字符,等同于:[^\d] |
转义字符
正则表达式里面还有一些特殊的符号是需要转义的,如[,],/,.{,},+,*,?等,需要使用\转义;
| 转义字符 |
对应说明 |
| \xnn |
匹配十六进制数 |
| \f |
匹配换页符,等同于:\x0c |
| \n |
匹配换行符,等同于:\x0a |
| \r |
匹配回车符,等同于:\x0d |
| \t |
匹配水平制表符,等同于:\x09 |
| \v |
匹配垂直制表符,等同于:\x0b |
| \unnnn |
匹配Unicode字符,如:\u00A0 |
重复匹配
| 匹配字符 |
对应说明 |
| * |
重复出现零次或多次 |
| + |
重复出现一次或多次 |
| ? |
重复出现零次或一次 |
|
重复出现n次 |
|
至少重复出现n次 |
|
重复重现m到n次,其中,m<n |
贪婪与惰性
贪婪模式:尽可能的选取多个;
惰性模式:尽可能少取
| 相关字符 |
对应说明 |
| *? |
重复任意次,但尽可能少的重复 |
| +? |
重复一次或多次,但尽可能少的重复 |
| ?? |
重复零次或一次,但尽可能少的重复 |
| {m,n}? |
重复m到n次,但尽可能少的重复 |
| {n,}? |
重复n次以上,但尽可能少的重复 |
原子组编号
1,原子表指的是[],从表中拿一个出来进行匹配;
2,原子组指的是(),形成一个个小隔离域进行匹配;
- 原子组通过
()来形成一个个分组,其实在形成分组的时候,默认会形成一个个分组编号;方便进行二次提取操作,比如匹配开始标签名与结束标签名时,要保持一致;
\1代表的是匹配出来的第1个分组内容,\2, \3以此类推;
前瞻后顾
- 前瞻: 匹配的是A,限制条件是A后面是B;
A(?=B)
- 后顾: 匹配表达式A,限制条件A的前面是B;
(?<=B)A
- 负前瞻: 匹配的是A,限制条件是A后面是B;
A(!=B)
- 负后顾: 匹配表达式A,限制条件A的前面是B;
(?<!B)A
格式化日期案例
const formatTime = (time: string | number | Date, fmt: string): string => {
// console.log(time, fmt)
//Date Wed May 17 2023 13:42:22 GMT+0800 (中国标准时间) HH: mm: ss/yyyy-MM-dd
if (!time) return ''
const date = new Date(time)
const o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'H+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds(),
'q+': Math.floor((date.getMonth() + 3) / 3),
S: date.getMilliseconds()
}
console.log(o)
//Object { "M+": 5, "d+": 17, "H+": 13, "m+": 52, "s+": 13, "q+": 2, S: 67 }
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
for (const k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
)
}
}
}
return fmt
}
//调用
const handleTime = () => {
timer= setInterval(() => {
const date = new Date()
dateDay = formatTime(date, 'HH: mm: ss')
dateYear = formatTime(date, 'yyyy-MM-dd')
dateWeek = WEEK[date.getDay()]
}, 1000)
}