正则匹配基础

正则表达式它是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)

    }