【JavaScript】正则

166 阅读1分钟

如何构建一个正则表达式

  • 构造函数:new RegExp("正则主体",[修饰符])
  • 字面量:/正则主体/修饰符

方法

  • test关键字,用来检测一个字符串是否符合一定规则,返回值truefalse
let str="123@qq.com"
let ret0 = /qq.com$/.test(str)
console.log(ret0) //true
  • exec关键字,捕获匹配到的符合的第一条内容。返回一个数组,index索引表示匹配内容第一个字符出现的位置
let str="123456@qq.com"
let ret1 = /(@)(qq.com)$/.exec(str)
let ret2 = /163.com$/.exec(str) // null

ret1结果如下:
image.png

元字符

  • .通配符,匹配单个的任意字符
  • [范围] 匹配范围中的任意一个。比如:[a-z] [A-Z] [0-9] ,注意:[^范围],取反的意思,比如:[^a-z],表示除了a-z的其余任意字符
  • \d 匹配单个数字 相当于[0-9] , \D 匹配单个非数字,相当于[^0-9]
  • \w 匹配单个的数字,字母,下划线 相当于[a-zA-Z0-9_];\W 匹配单个非数字,非字母,非下划线 相当于 [^a-zA-Z0-9_]
  • \s 匹配单个空白字符 空格 换行(\n),制表(\t) \S 匹配单个非空白字符

限定元字符

  • ^行首匹配 必须以后面的字符开头
  • $行尾匹配 必须以前面的字符结尾
  • {m} 表示出现m次。 相当于{m,m}
  • {m,} 没有上限,最少匹配m次。
  • {m,n} 至少匹配m次,最多匹配n次。
  • ?等价于{0,1} 要么不出现,要么出现一次。
  • *等价于{0,} 匹配任意次(包含零次)。
  • +等价于{1,} 至少出现一次。

例子

手机号码加星号

function formatPhone(phone) {
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}
let ret = formatPhone("13800000000")
console.log(ret)//138****0000

批量替换

function formatUUID(uuid) {
  return uuid.replace(/-/g, "_")
}
const ret = formatUUID('3083c53a-89a5-491c-967e-b3551a6b91f0')
console.log(ret)// 3083c53a_89a5_491c_967e_b3551a6b91f0

数字字符串转大写

function formtCnNumber(str) {
  const arr = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
  return str.replace(/\d/g, (i) => {
    return arr[i]
  })
}
const ret = formtCnNumber("9876543210")
console.log(ret)

实现一个简单的模板引擎

function simpleTmpl(str, dataArr) {
  return str.replace(/\{(\d)\}/g, (...args) => {
    console.log('a', args)
    return dataArr[args[1]]
  })
}
const str = '我的名字是:{0},今年{1}岁,住在{2}'
const data = ['小李', 22, '北京']
const ret = simpleTmpl(str, data)
console.log(ret)