我在做Freecodecamp RegEx挑战赛,这是关于:
使用pwRegex中的查找头来匹配大于5个字符的密码,不要以数字开头,并且有两个连续的数字
到目前为止,我找到的解决方案通过了所有测试:
/^[a-z](?=\w{5,})(?=.*\d{2}\.)/i然而,当我尝试
/^[a-z](?=\w{5,})(?=\D*\d{2,}\D*)/i我在试图与astr1on11aut匹配的测试中失败了(但通过了astr11on1aut)。那么谁能帮我解释一下?=\D*\d{2,}\D*是如何通过这个测试的吗?
发布于 2020-06-23 14:33:38
当谈到regex中的前瞻性用法时,请在模式的开始部分锚定它们。见查找者(通常)希望被锚定。这将帮助您在处理密码regexp时避免许多问题。
现在,让我们看看您有哪些要求:
(?=.{6}) (它要求除留置权以外的任何6个字符立即在当前位置的右侧)(?!\d) (右边不允许任何数字)have two consecutive digits => (?=.*\d{2}) (任何两个数字的文本块都需要在任何0或更多的字符之后,而不是在当前位置右侧的尽可能多的断行字符之后)。所以,你可以用的是
^(?!\d)(?=.{6})(?=.*\d{2})注意,最昂贵的部分放在模式的末尾,这样如果输入不匹配,它可能会更快地失败。
见regex演示。
发布于 2020-06-23 12:39:00
\d{2,}失败
然后让我们看看regexp的匹配过程。
/^[a-z](?=\w{5,})意思是从a开始,长度至少是6,没问题。
(?=\D*\d{2,}\D*)意思是第一个字母后面应该有以下几个部分:
[0 or more no-digit][2 or more digits][0 or more no-digits]让我们来看看测试用例。
astr1on11aut
// ^[a-z] match "a"
// length matchs
// [0 or more no-digit]: "str"
// d{2,} failed: only 1 digit?=位置前瞻表示后面紧跟着。
第一个正则表达式是错误的,应该是
/^[a-z](?=\w{5,})(?=.*\d{2}.*)/i发布于 2020-06-23 16:15:34
那么谁能帮我解释一下
(?=\D*\d{2,}\D*)是如何通过这个测试的吗?
使用\D可以匹配除一个数字之外的任何字符,因此从字符串开始,就不能传递单数到2位数字。
解释
astr1on11aut astr11on1aut
^ ^^
Can not pass 1 before reaching 11 Can match 2 digits firstNote
(?=\D*\d{2}),因为如果有2、3或更多,这并不重要,因为2是最小值,\D*是可选的。^[a-z](?=\w{5,})(?=.*\d{2}\.)不能匹配示例数据,因为它期望在2位之后匹配一个.。https://stackoverflow.com/questions/62533951
复制相似问题