0

此正则表达式必须匹配长度超过 5 个字符、不以数字开头且具有两个连续数字的密码。

所有测试用例都通过了正则表达式测试。

我的正则表达式是/(?=^[a-z]+\d{2,})(?=\w{5,})/

我必须使用两个积极的前瞻来解决这个问题才能通过测试。

但是 asr1on11aut 没有通过测试。为什么?

链接到问题 - https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/regular-expressions/positive-and-negative-lookahead

4

4 回答 4

2

由于第一个前瞻模式,您的正则表达式失败(?=^[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)}`);
}

请注意,此正则表达式不需要letters。严格按照要求,唯一明确要求的是数字。由于没有指定任何其他输入的类型,所以它可以是任何东西(使用.)。编写正则表达式时最好不要做太多假设,否则可能会阻止合法输入。

于 2020-11-10T07:59:06.070 回答
1

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

if (input.match(/^\D/)
    && input.match(/\d{2}/)
    && input.length >= 5) {
  // password policy fulfilled
}
于 2020-11-10T07:23:31.997 回答
1

这对你有用吗?

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

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

于 2020-11-10T07:36:03.507 回答
0

这个正则表达式通过了所有的测试

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

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

于 2020-11-10T07:48:20.077 回答