构建正则有一点非常重要,需要做到下面几点的平衡

1. 构建正则前提

是否能使用正则

正则虽然强大,但不是万能的,很多看似很简单的事情,还是做不到的。

比如匹配这样的字符串:1010010001…。虽然很有规律,但是只靠正则就是无能为力。

是否有必要使用正则

比如,从日期中提取出年月日,虽然可以使用正则,但更好的方式是使用 split 来做:

const target = '2022-04-01'

target.match(/^(\\d{4})-(\\d{2})-(\\d{2})/)
// ['2022-04-01', '2022', '04', '01', index: 0, input: '2022-04-01', groups: undefined]

target.split('-')
// ['2022', '04', '01']

是否有必要构建一个复杂的正则

比如密码匹配问题,要求密码长度 6-12 位,由数字、小写字符和大写字母组成,但必须至少包括 2 种字符。(详情请见: 密码匹配问题

正则可以是:/(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/

但更好的做法是拆分多个小正则来做:

const regExp1 = /^[0-9A-Za-z]{6,12}$/
const regExp2 = /^[0-9]{6,12}$/
const regExp3 = /^[A-Z]{6,12}$/
const regExp4 = /^[a-z]{6,12}$/

const checkPassword = (target) => {
  if (!regExp1.test(target)) return false
  if (regExp2.test(target)) return false
  if (regExp3.test(target)) return false
  if (regExp4.test(target)) return false
  return true
}

2. 测试性能的方法