工具函数系列-正则表达式

参考链接:

RegExp(正则表达式): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp

正则表达式:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

基础

概念

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。

这些模式被用于 RegExpexectest 方法, 以及 StringmatchmatchAllreplacesearchsplit 方法。

正则表达式的模式:一个正则表达式模式是由简单的字符所构成的,比如 /abc/;或者是简单和特殊字符的组合,比如 /ab*c//Chapter (\d+)\.\d*/

创建

字面量方式
var re = /ab+c/;
构造函数方式(RegExp对象)
var re = new RegExp("ab+c");

使用场景:可以动态正则表达式的模式。

RegExp.$1-$9

非标准**$1, $2, $3, $4, $5, $6, $7, $8, $9** 属性是包含括号子串匹配的正则表达式的静态和只读属性。

特殊字符

可以使用特殊字符进行匹配。

分类:

  • 断言:表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。
  • 字符类:区分不同类型的字符,例如区分字母和数字。如\d\s 等。
  • 组和范围:表示表达式字符的分组和范围。
  • 量词:表示匹配的字符或表达式的数量。
  • Unicode 属性转义:基于 unicode 字符属性区分字符。例如大写和小写字母、数学符号和标点。

应用

使用ASCII码校验

ASCII

校验长度[6, 64]的英文、数字、英文字符
function test(str) {
    const reg = /^[\x21-\x7e]{6,64}$/g
    return reg.test(str)
}

测试

function generateMixed(n, arr) {
    let res = ''
    const arrLen = arr.length - 1
    for (let i = 0; i < n; i++) {
        res += arr[Math.ceil(Math.random() * arrLen)]
    }
    return res
}

function test(str) {
    const reg = /^[\x21-\x7e]{1,64}$/g
    return reg.test(str)
}

function verifyReg() {
    const arr = [`,`, `.`, `;`, `:`, `/`, `[`, `]`, `<`, `>`, `{`, `}`, `(`, `)`, `'`, `"`, `!`, `?`, `&`, `^`, `%`, `$`, `#`, `@`, `~`, `+`, `*`, `-`, `=`, `|`]

    const upper = 64, lower = 6

    for (let i = 0; i < 10; i++) {
        arr.push(i)
    }
    
    for (let i = 0; i < 26; i++) {
        const s = String.fromCharCode(97 + i)
        arr.push(s)
        arr.push(s.toUpperCase())
    }

        
    for (let i = 0; i < 10; i++) {
        const len = Math.floor(Math.random() * (upper - lower+1)) + lower;
        const str = generateMixed(len, arr)
        console.log(len, str, test(str))
    }
}
verifyReg()

格式化时间

function formatDate(time, fmt) {
  const date = new Date(time)

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, String(date.getFullYear()).substring(4 - RegExp.$1.length))
  }

  let o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'S+': date.getMilliseconds()
  }

  for (let k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      let str = String(o[k])
      fmt = fmt.replace(RegExp.$1, RegExp.$1.length > 1 ? padLeftZero(str) : str)
    }
  }
  return fmt
}

function padLeftZero(str) {
  return ('00' + str).substring(str.length)
}