正则之零宽断言

我们两清 提交于 2020-03-02 04:27:33

1.什么是零宽断言:

零宽断言正如它的名字一样,是一种 零宽度的匹配. 它匹配到的内容不会保存到匹配结果中去, 最终匹配结果只是一个 位置 而已.

2.何时使用零宽断言:

在使用正则表示式时, 有时, 我们需要捕获的内容前后必须是特定内容, 但又不捕获这些特定内容的时候, 零宽断言就起到作用了

3.如何使用零宽断言:

零宽断言的作用是 给指定位置添加一个限定条件, 用来规定此位置之前或者之后的字符必须满足限定条件, 才能使正则中的表达式匹配成功.

4.零宽断言分类:

  • (?=exp) 也叫 零宽度正预测先行断言,它断言此位置的 后面能匹配 表达式exp
  • (?!exp) 也叫 零宽度负预测先行断言,断言此位置的 后面不能匹配 表达式exp
  • (?<=exp) 也叫 零宽度正回顾后发断言,它断言此位置的 前面能匹配 表达式exp
  • (?<!exp) 也叫 零宽度负回顾后发断言来断言此位置的 前面不能匹配 表达式exp

5.例子: " abCabcab, "

/ab( ?=[A-Z])/匹配后面跟随任意一个大写字母的字符串”ab”, 最终匹配结果”ab” (大写字母C前的"ab")
/ab( ?![A-Z])/匹配后面不跟随任意一个大写字母的字符串”ab”, 最终匹配结果”ab””ab”(小写字母c前的"ab",和",“前面的"ab”)

6.实际应用: 千分符和密码强度

(1)千分符 :

Var str= ”123456789.12”------> “123,456,789.12”

分析: 从数字的结尾或者从数字的小数点开始,每往前数3位数(n个3位,n>=1)的数字后面, 便应该添加一个 ” , ”

步骤:

  1. 用零宽断言先找到这些位置:\d(?=(\d {3})+($|\.))
  2. 用string提供的replace函数,将正则找到的位置,替换成 \d+” , ” str=str.replace(/(\d)(?=(\d {3})+($|\.))/g , “$1, “)

注意 :

  1. 全局查找加g
  2. 避免与通配符冲突,需要给.加上转义字符.
  3. 给\d加上( ), 换replace内置的$1 ,便拿到整个正则中第一个圆括号里的内容

(2)密码强度 :

例如: 密码要求:
①要求密码由字母和数字组成 ,不能有特殊字符;
②密码总长度大于等于6位
③至少包含一位数字;
④至少包含一位大写字母;

实现步骤:

  1. 实现要求①和② : ^[A-Za-z0-9]{6,}$
  2. 实现要求③: 利用零宽断言取反(不能全部由字母组成): ^(?![a-zA-Z]+$)
    注意: $ 需写()里面, 是一种预判 !!
  3. 实现要求④: 利用零宽断言取反(不能全部由小写字母和数字组成): ^(?![a-z0-9]+$)
  4. 最后将3个分步骤组合起来(注意组合顺序):
    var reg=/^(?![a-z0-9]+$)(?![a-zA-Z]+$)[A-Za-z0-9]{6,}$/g;

判断:
请问: 用户设置密码为”Zxxxxxx1” ,判断是否符合要求?
Var str=”Zxxxxxx1”
reg.test(str) //true

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!