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)

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值