『正则 断言』千分位,密码校验,断言与边界的运用

230 阅读1分钟

如果想深究千分位,请看掘金前辈文章 - 6种方法与性能

前提知识

  • ^ 匹配开始
  • $ 匹配结束
  • \d 匹配数字,等价于[0-9]
  • 正则中,字符只分两种
    1. 单字字符,等价于[A-Za-z0-9_],记为 \w
    2. 不是 单字字符,等价于[^A-Za-z0-9_],记为 \W
      • \W 包括 ^$

断言与边界

断言知识

  • 先行断言:x(?=y),后面是y,匹配x
  • 后行断言:(?<=y)x,前面是y,匹配x

边界知识

  • \b 匹配 \w\W 之间的边界
  • \B 匹配 两个\w 或 两个\W\W 之间的边界
  • 断言中,会存在''空字符,即包括\b\B
    • 意思就是你写一个断言y,却不写x,那就匹配空字符

千分位

@胖头鱼的千分位写法

'123456789'.replace(/(?=(\d{3})+$)/g, ',') // ,123,456,789

这里就是因为没写x,那么匹配所有边界(这里@胖头鱼直接否定断言,断言不能为开头(?!^))。所以任何情况,请显式地写上想要地边界。像这样

'123456789'.replace(/\B(?=(\d{3})+$)/g, ',') // 123,456,789

image.png

小数点情况

日常使用中,数字会有小数,但一般对小数部分不加千分位分隔符,那么:

  1. 结尾可以为$,也可以为.
  2. 再限制一下前面只能为数字
'12345.6789'.replace(/(?<=^\d+)\B(?=(\d{3})+($|\.))/g, ',') // 12,345.6789

image.png

否定断言

  • 先行否定断言:x(?!y),后面不是y,匹配x
  • 后行否定断言:(?<!y)x,前面不是y,匹配x

校验密码 (正则的叠加)

  1. 密码长度是6-12位 : /^(?=.{6,12}$)/
  2. 由数字、小写字符和大写字母组成 : /^(?=[\da-zA-Z]{6,12}$)/
  3. 必须至少包括2种字符 => 不能只是一种 : /^(?=[\da-zA-Z]{6,12}$)(?!\d+$)(?![a-z]+$)(?![A-Z]+$)/

image.png

友情链接