首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式:正和负的前瞻性解决方案

正则表达式:正和负的前瞻性解决方案
EN

Stack Overflow用户
提问于 2020-06-23 11:46:22
回答 3查看 930关注 0票数 3

我在做Freecodecamp RegEx挑战赛,这是关于:

使用pwRegex中的查找头来匹配大于5个字符的密码,不要以数字开头,并且有两个连续的数字

到目前为止,我找到的解决方案通过了所有测试:

代码语言:javascript
复制
/^[a-z](?=\w{5,})(?=.*\d{2}\.)/i

然而,当我尝试

代码语言:javascript
复制
/^[a-z](?=\w{5,})(?=\D*\d{2,}\D*)/i

我在试图与astr1on11aut匹配的测试中失败了(但通过了astr11on1aut)。那么谁能帮我解释一下?=\D*\d{2,}\D*是如何通过这个测试的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-23 14:33:38

当谈到regex中的前瞻性用法时,请在模式的开始部分锚定它们。见查找者(通常)希望被锚定。这将帮助您在处理密码regexp时避免许多问题。

现在,让我们看看您有哪些要求:

  • “大于5个字符长”=> (?=.{6}) (它要求除留置权以外的任何6个字符立即在当前位置的右侧)
  • “不要以数字开头”=> (?!\d) (右边不允许任何数字)
  • have two consecutive digits => (?=.*\d{2}) (任何两个数字的文本块都需要在任何0或更多的字符之后,而不是在当前位置右侧的尽可能多的断行字符之后)。

所以,你可以用的是

代码语言:javascript
复制
^(?!\d)(?=.{6})(?=.*\d{2})

注意,最昂贵的部分放在模式的末尾,这样如果输入不匹配,它可能会更快地失败。

regex演示

票数 2
EN

Stack Overflow用户

发布于 2020-06-23 12:39:00

\d{2,}失败

然后让我们看看regexp的匹配过程。

代码语言:javascript
复制
/^[a-z](?=\w{5,})

意思是从a开始,长度至少是6,没问题。

代码语言:javascript
复制
(?=\D*\d{2,}\D*)

意思是第一个字母后面应该有以下几个部分:

代码语言:javascript
复制
[0 or more no-digit][2 or more digits][0 or more no-digits]

让我们来看看测试用例。

代码语言:javascript
复制
astr1on11aut
// ^[a-z] match "a"
// length matchs
// [0 or more no-digit]: "str"
// d{2,} failed: only 1 digit

?=位置前瞻表示后面紧跟着。

第一个正则表达式是错误的,应该是

代码语言:javascript
复制
/^[a-z](?=\w{5,})(?=.*\d{2}.*)/i
票数 3
EN

Stack Overflow用户

发布于 2020-06-23 16:15:34

那么谁能帮我解释一下(?=\D*\d{2,}\D*)是如何通过这个测试的吗?

使用\D可以匹配除一个数字之外的任何字符,因此从字符串开始,就不能传递单数到2位数字。

解释

代码语言:javascript
复制
astr1on11aut                            astr11on1aut
    ^                                       ^^
    Can not pass 1 before reaching 11       Can match 2 digits first

Note

  • 表达式可以缩短为(?=\D*\d{2}),因为如果有2、3或更多,这并不重要,因为2是最小值,\D*是可选的。
  • 第一个表达式^[a-z](?=\w{5,})(?=.*\d{2}\.)不能匹配示例数据,因为它期望在2位之后匹配一个.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62533951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档