如果想深究千分位,请看掘金前辈文章 - 6种方法与性能
前提知识
^
匹配开始$
匹配结束\d
匹配数字,等价于[0-9]- 正则中,字符只分两种
- 是 单字字符,等价于[A-Za-z0-9_],记为
\w
- 不是 单字字符,等价于[^A-Za-z0-9_],记为
\W
\W
包括^
、$
- 是 单字字符,等价于[A-Za-z0-9_],记为
断言与边界
断言知识
- 先行断言:
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
小数点情况
日常使用中,数字会有小数,但一般对小数部分不加千分位分隔符,那么:
- 结尾可以为
$
,也可以为.
- 再限制一下前面只能为数字
'12345.6789'.replace(/(?<=^\d+)\B(?=(\d{3})+($|\.))/g, ',') // 12,345.6789
否定断言
- 先行否定断言:
x(?!y)
,后面不是y,匹配x - 后行否定断言:
(?<!y)x
,前面不是y,匹配x
校验密码 (正则的叠加)
- 密码长度是6-12位 :
/^(?=.{6,12}$)/
- 由数字、小写字符和大写字母组成 :
/^(?=[\da-zA-Z]{6,12}$)/
- 必须至少包括2种字符 => 不能只是一种 :
/^(?=[\da-zA-Z]{6,12}$)(?!\d+$)(?![a-z]+$)(?![A-Z]+$)/