为了账号安全,请及时绑定邮箱和手机立即绑定

我的正则表达式 /(?=^[az]+\d{2,})(?=\w{5,})/ 模式有什么问题?

我的正则表达式 /(?=^[az]+\d{2,})(?=\w{5,})/ 模式有什么问题?

繁星淼淼 2023-07-20 17:30:11
此正则表达式必须匹配长度超过 5 个字符、不以数字开头且具有两个连续数字的密码。所有测试用例都通过正则表达式测试。我的正则表达式是/(?=^[a-z]+\d{2,})(?=\w{5,})/我必须使用两个正向前瞻来解决这个问题才能通过测试。但 astr1on11aut 没有通过测试。为什么?
查看完整描述

4 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

该正则表达式通过了所有测试

/(?=\w*\d\d)(?=\w{5,})(?=^[^0-9]\w*)/

我相信你可以通过拆分第一组来解决你的问题。


查看完整回答
反对 回复 2023-07-20
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

由于第一个前瞻模式,您的正则表达式失败(?=^[a-z]+\d{2,})。字符串“astr1on11aut”以小写字母开头:


astr1on11aut

^^^^

这匹配^[a-z]+. 然而,模式的下一部分需要两个或更多数字\d{2,},但字符串在该位置只有一个:


   astr1on11aut

       ^^

       ||

digit -+|

        + --- not a digit

这会导致第一个先行模式失败。

您可以使用三个前瞻更清晰地表达验证规则:

  • “长度超过 5 个字符:(?=.{5,})

  • “不要以数字开头”:^(?!\d)

  • “并且有两个连续的数字”:(?=.*\d{2})

如果我们把它们放在一起我们得到/(?=.{5,})(?!^\d)(?=.*\d{2})/

const regex = /^(?=.{5,})(?!\d)(?=.*\d{2})/;


test("abc");

test("123");

test("123abc");


test("abc123");

test("astr1on11aut");


test("., ;_'@=-%");

test("., ;_'@123=-%");


function test(string) {

  console.log(`${string} : ${regex.test(string)}`);

}

请注意,此正则表达式不需要letter。严格遵循要求,唯一明确要求的是数字。由于未指定任何其他输入的类型,因此它可以是任何内容(使用.)。编写正则表达式时最好不要做出太多假设,否则可能会阻止合法输入。



查看完整回答
反对 回复 2023-07-20
?
Qyouu

TA贡献1786条经验 获得超11个赞

如果您不限于使用单个正则表达式,我建议将其分成使用您的宿主语言(例如 JavaScript)的多个测试:


if (input.match(/^\D/)

    && input.match(/\d{2}/)

    && input.length >= 5) {

  // password policy fulfilled

}


查看完整回答
反对 回复 2023-07-20
?
茅侃侃

TA贡献1842条经验 获得超21个赞

这对你有用吗?

(?=^\D.{5,}$).*(?=\d{2,})

第一个先行断言字符串不得以数字开头,但长度至少为 6 个字符;第二个断言必须至少有 2 个连续数字。


查看完整回答
反对 回复 2023-07-20
  • 4 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信