常用的正则表达式(随时更新记录项目中遇到的)

汉字匹配

  • [一-龥]
  • /[\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位数字YYMMDD3位数字
18位身份证1-9开头的6位数字YYYYMMDD3位数字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+/ 用于匹配重复数字,如 111123123\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) 匹配开头或空格

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值