js正则匹配及格式化日期案例

正则匹配基础

正则表达式它是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次
{n,} 至少重复出现n次
{m,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)

    }

猜你喜欢

转载自blog.csdn.net/m0_52276756/article/details/130725179