搜尋

首頁  >  問答  >  主體

javascript 正则表达式 的 x(?=y) 和x(?!y)

其实我是懂的x(?=y)x(?!y)的用法,但是我实在看不懂下面这两个正则表达式的工作原理
密码匹配 大小写字母和数字
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
密码匹配 大小写字母 特殊字符和数字 最小长度8位
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
原网址在这里 http://html5pattern.com/Passwords

额是这样的.看不懂的原因有两个.
1. 在模式x(?=y)x(?!=y)里,为啥缺少了x还能匹配?
2. 连续几个(?=y) 合在一起写如何理解?

大家讲道理大家讲道理2818 天前1444

全部回覆(2)我來回復

  • 巴扎黑

    巴扎黑2017-04-10 14:46:55

    x(?=y)x(?!=y)缺少了x是不能匹配的,如果你所理解的(我不知道你怎么理解的),但是你为啥怀疑这点来了呢,测试一下便知。

    var re = /x(?=y)/;
    console.log(re.test('yy'));
    console.log(re.test('xy'));
    

    (?=.*\d)(?=.*[a-z])(?=.*[A-Z])可以看成三组正向环视,三组连在一起(顺序不重要)都是在匹配右边的位置,如果是x(?=y)这种形式的话,我们说如果x匹配到了,正则表达式继续向右匹配(如果引擎是这样传送要被匹配的字符的,暂不论DFA和NFA了),但是(?=y)只是查看右边是不是有y,如果再来一组(?=z)其实也是在考察x的右边位置。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-10 14:46:55

    1. (?=y)匹配的是一个位置(即后面有y的位置),跟有没有x没有关系
    2. 多个零宽断言放在一起表示这个位置必须同时满足多个条件

    第一个正则表达式表示必须含有一个数字,一个小写字母,一个大写字母并且不能含有空白字符
    第二个同理

    回覆
    0
  • 取消回覆