正则匹配基础
正则表达式它是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)
}