js正则先行断言,

引子,之前学的正则大多都是比较死板的一个扣一个,有时候遇到难点的又是网上抄袭,很费事,费力。晚上无聊学习下正则。

首先看个例子,匹配一个密码,但是必须有字母和数字,这是网上一个比较常见的案列;

/^(?=.*[0-9])(?=.*[a-z])[0-9A-Za-z]{6,12}$/
  1. 首先看?=这个代表什么,(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如w+(?=ing),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。这里引自《正则30分钟入门那篇课程》,http://deerchao.net/tutorials/regex/regex.htm#more
  2. 也就是说?=表示,他断言他出现的位置能匹配后面的表达式,说直白一点,就是他这里做了限制,后面的的表达式必须符合标注。那这里做了什么限制了?
  3. 这个地方有点难以理解,对我来说。看个人吧。他不能匹配到字符,他是匹配了为位置,记住位置,$^这些都是在匹配位置;
  4. 完整的来讲,我在开头^紧跟着的位置,也可以理解就在开头,我发话了,后面的表达式,都配合下我演出 内容是  .*[0-9]我匹配任意字符,但是后面你们一定要给我来个数字必须有
  5. 都说了必须有数字嘛,有了就行了。但是这个范围其实很大,离你匹配的东西差距很远,所以大规则下还有小规则;

  6. [0-9A-Za-z]{6,12}$这是小规则,在满足大规则的前提下,我还具体约束一下。老大说了任意字符都匹配有字母和数字就行,但是我这里必须匹配字母数字,还有个数要求。这是具体匹配。来看个例子,

    老大说了,要满足他的条件,我想在后面加个.com看看行不行,形如这种格式

  7. 这样是不行的老大匹配的是位置,满足条件。你这是具体的东西啊,这里一定要理清位置,和具体字符的关系。.com是实际要匹配的。那怎样才行了?

  8. 我现在写的表达式满足老大的意思了吧,
  9.  这样就行了,前面的断言要满足,后面匹配实际的字符也要满足,一旦有冲突,就会匹配不了。

原文地址:https://www.cnblogs.com/manu-yyj/p/11247749.html