工具函数系列-正则表达式
参考链接:
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中,正则表达式也是对象。
这些模式被用于 RegExp
的 exec
和 test
方法, 以及 String
的 match
、matchAll
、replace
、search
和 split
方法。
正则表达式的模式:一个正则表达式模式是由简单的字符所构成的,比如 /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码校验
校验长度[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)
}