昨天我回答了一个问题,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/