汉字匹配
[一-龥]
/[\u4e00-\u9fa5]/
数字校验
^(0|[1-9]\d*)$
非负整数^(0|[1-9]\d*)(\.\d+)?$
非负浮点数^-?\d+(\.\d+)?$
数字
格式类
密码
必须包含大小写字母、数字和它们以外的字符
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^\da-zA-Z]).{6,}$/
身份证号
身份证号目前有两种:15位数字 / 18位数字(末位可以为 X)
身份证号的组成部分为:
地址码 | 出生日期码 | 顺序码 | 校验码 | |
---|---|---|---|---|
15位身份证 | 1-9开头的6位数字 | YYMMDD | 3位数字 | 无 |
18位身份证 | 1-9开头的6位数字 | YYYYMMDD | 3位数字 | 1位数字或X(代表10) |
正则:
/^([1-9]\d{5})((19|2\d)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][\d]|3[01])\d{3}[\dxX]|\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][\d]|3[01])\d{3})$/
说明:
^([1-9]\d{5})
匹配以地址码为开头的字符串- 后面匹配了剩余的部分,分别是包含校验码的 12 位内容 和 不包含校验码的 9位内容
- 分开匹配的原因是:为了匹配同时满足 ‘位数’ 和 ‘校验码’ 的条件
- 出生日期码-年:
(19|2\d)\d{2}
YYYY格式的年份\d{2}
YY 格式的年份
- 出生日期-月日:
(0[1-9]|[12][\d]|3[01])
- 顺序码:
\d{3}
- 校验码:
[\dxX]
$
收尾屏蔽其它字符
操作类
匹配重复字符
/(.+)\1+/
用于匹配重复数字,如 111
、123123
,\1
代表复用第一个捕获组的内容。
常用示例:提取重复字符
const collectRepeatStr = (str) => {
let repeatStrs = []
const repeatRe = /(.+)\1+/g
// 很多时候replace并不是用来做替换,而是做数据提取用
str.replace(repeatRe, ($0, $1) => {
$1 && repeatStrs.push($1)
})
return repeatStrs
}
去除空格
- 去除空格方式:
str.replace(/^\s*|\s*$/g, '')
- 提取非空格方式:
str.replace(/^\s*(.*?)\s*$/g, '$1')
数字价格千分位分割
'123456789'.replace(/(?!^)(?=(\d{3})+$)/g, ',') // 123,456,789
(?!^)
或(?<!^)
断言匹配非起始位置,避免在开头添加,
/(?=\d{3}$)/
从右向左匹配第一个后面紧跟连续3个数字的位置(位置,而不是某个字符)(?=(\d{3})+$)
从右向左匹配后面紧跟连续3个数字的位置
手机号 3-4-4 分割
'15612345678'.replace(/(?=(\d{4})+$)/g , '-') // 156-1234-5678
(?=(\d{4})+$)
从右向左匹配每后面紧跟4个数字的位置
字符串驼峰化
/*
1. foo Bar => fooBar
2. foo-bar---- => fooBar
3. foo_bar__ => fooBar
*/
const camelCase = (string) => {
const camelCaseRegex = /[-_\s]+(.)?/g
return string.replace(camelCaseRegex, (match, char) => {
return char ? char.toUpperCase() : ''
})
}
这个主要使用的是 replace 的第二个参数进行替换
英文单词首字母大写
const capitalize = (string) => {
const capitalizeRegex = /(^|\s)\w/g
return string.toLowerCase().replace(capitalizeRegex, (match) => match.toUpperCase())
}
console.log(capitalize('hello world')) // Hello World
console.log(capitalize('hello WORLD')) // Hello World
(^|\s)
匹配开头或空格