正则难点总结

70 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

image.png

/(?=.*\d)/匹配满足条件的位置

let reg = /(?=.*\d)/
// 这个正则的意思是,匹配的是一个位置
// 这个位置需要满足`任意数量的符号,紧跟着是个数字`,
// 注意它最终得到的是个位置而不是其他的东西
// (?=.*\d)经常用来做条件限制

console.log(reg.test('hello')) // false
console.log(reg.test('hello1')) // true
console.log(reg.test('hel2lo')) // true

// 其他类型同理


难点概念

正向预查

?=就是正向预查的正则表达式,所谓正向,是因为它匹配的是?=表达式左边的表达式。比如有<表达式1>(?=<表达式2>),那么它只能匹配到<表达式2>左边的符合<表达式1>的字符串。看下面例子

/\d+(?=%)/.test('50%') // 匹配出50,这个表达式是要提取出百分数字,RegExp.$1=50

反向预查

?<=反向预查的正则表达式,和正向相反,它匹配的是?<=表达式右边的表达式。

/(?<=$)(\d+)/.test("$90") // 匹配出90,这个表达式是要提取金额数字,RegExp.$1=90

数字千分位分割

实现思路

  • 将用户传入的数字转为字符串。

  • 校验出入的值是否是数值。

  • 判断是否包含小数点。

  • 如果不包含小数点,则直接对数字进行千分位处理。

  • 包含小数点,则对小数点喝整数分别处理。

将123456789变成123,456,789

// 金额千分位格式化
function momenyFormat(num) {
  // 数字转字符串
  let result = `${num}`;
  // 校验输入值是否为数字
  const regNumber = /^\d+$|(\d+.\d+)/g;
  // 校验小数点及右侧部分
  const regRight = /(?<=\d)(.\d+)/g;
  // 校验小数点左侧的部分
  const regLeft = /(\d)(?=(\d{3})+$)/g;
  // 判断是否是数字
  if (regNumber.test(result)) {
        // 判断是否包含小数点
    if (/./g.test(result)) {
            // 提取小数点和右侧部分
      const right = regRight.exec(result)[0];
            // 替换小数点和右侧部分为空白,得到小数点左侧部分
            // 对左侧部分进行千分位处理
      const left = result.replace(regRight, "").replace(regLeft, "$1,");
            // 左右两部分拼接
      result = `${left}${right}`;
    } else {
            // 不包含小数点,直接千分位处理
      result = result.replace(regLeft, "$1,");
    }
  } else {
    console.warn(`invalid number ${num}`);
  }
  return result;
}

console.log(momenyFormat()); // warn + undefined
console.log(momenyFormat(1231)); // '1,231'
console.log(momenyFormat("123213.23211w")); // warn + '123213.23211w'
console.log(momenyFormat(1232137.23211)); // 1,232,137.23211
console.log(momenyFormat("32s.324")); // warn + "32s.324"
console.log(momenyFormat("122213,343")); // warn + "122213,343"