昨天我回答了一个问题,where the user was trying to match character classes "in any order."正则表达式本身没有“和”构造,但是我想出了解决方案(节略):

(?=[a-z])(?=\d)[a-z\d]{6,}


这样行不通,但是将其更改为

(?=.*[a-z])(?=.*\d)[a-z\d]{6,}


确实有效。由于先行不消耗任何东西,因此我发现此通配符要求有些奇怪。为什么需要.*来使此表达式匹配,例如a1a1a1

最佳答案

需要使用通配符,以便超前可以表示“前方任何地方”,而不是“正前方”。

没有它,您的正则表达式是这样的:


在满足以下条件的字符串中找到某个位置(称为X):
X之后的字符是字母
X后面的字符也是数字
X后面有6个或更多字母数字字符


由于中间两个是互斥的(一个字符不能是字母和数字),它将始终失败。

但是,第二个正则表达式表示:


在满足以下条件的字符串中找到某个位置(称为X):
任意数量的字符后,有一个字母
任意数量的字符后,有一个数字
X后面至少有6个字母数字字符


希望这可以解释差异;)

关于javascript - 超前的行为就像是消耗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15169299/

10-11 11:18