我的正则表达式 /(?=^[a-z]+\d{2,})(?=\w{5,})/ 模式有什么问题?
What is wrong in my regex /(?=^[a-z]+\d{2,})(?=\w{5,})/ pattern?
此正则表达式必须匹配长度超过 5 个字符、不以数字开头且有两个连续数字的密码。
所有测试用例都通过正则表达式测试。
我的正则表达式是 /(?=^[a-z]+\d{2,})(?=\w{5,})/
我必须使用两个积极的前瞻来解决这个问题才能通过测试。
但是astr1on11aut没有通过测试。为什么?
如果您不限于使用 单个 正则表达式,我建议将其分成多个使用您的宿主语言的测试(例如 JavaScript):
if (input.match(/^\D/)
&& input.match(/\d{2}/)
&& input.length >= 5) {
// password policy fulfilled
}
这对你有用吗?
(?=^\D.{5,}$).*(?=\d{2,})
第一个先行断言字符串不能以数字开头,但至少有 6 个字符长;第二个断言必须至少有 2 个连续数字。
这个正则表达式通过了所有测试
/(?=\w*\d\d)(?=\w{5,})(?=^[^0-9]\w*)/
我相信你可以通过拆分第一组来解决你的问题。
您的正则表达式因第一个先行模式 (?=^[a-z]+\d{2,})
而失败。字符串“astr1on11aut”以小写字母开头:
astr1on11aut
^^^^
这匹配 ^[a-z]+
。然而,模式的下一部分需要两个或更多数字 \d{2,}
,但是字符串在那个地方只有一个:
astr1on11aut
^^
||
digit -+|
+ --- not a digit
这会导致第一个先行模式失败。
您可以使用三个 lookaheads 更清晰地表达验证规则:
- "长度大于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)}`);
}
请注意,此正则表达式不需要 个字母 。严格按照要求,唯一明确要求的是数字。由于未指定任何其他输入的类型,因此它可以是任何类型(使用 .
)。编写正则表达式时最好不要做太多假设,否则你可能会阻止合法输入。
此正则表达式必须匹配长度超过 5 个字符、不以数字开头且有两个连续数字的密码。
所有测试用例都通过正则表达式测试。
我的正则表达式是 /(?=^[a-z]+\d{2,})(?=\w{5,})/
我必须使用两个积极的前瞻来解决这个问题才能通过测试。
但是astr1on11aut没有通过测试。为什么?
如果您不限于使用 单个 正则表达式,我建议将其分成多个使用您的宿主语言的测试(例如 JavaScript):
if (input.match(/^\D/)
&& input.match(/\d{2}/)
&& input.length >= 5) {
// password policy fulfilled
}
这对你有用吗?
(?=^\D.{5,}$).*(?=\d{2,})
第一个先行断言字符串不能以数字开头,但至少有 6 个字符长;第二个断言必须至少有 2 个连续数字。
这个正则表达式通过了所有测试
/(?=\w*\d\d)(?=\w{5,})(?=^[^0-9]\w*)/
我相信你可以通过拆分第一组来解决你的问题。
您的正则表达式因第一个先行模式 (?=^[a-z]+\d{2,})
而失败。字符串“astr1on11aut”以小写字母开头:
astr1on11aut
^^^^
这匹配 ^[a-z]+
。然而,模式的下一部分需要两个或更多数字 \d{2,}
,但是字符串在那个地方只有一个:
astr1on11aut
^^
||
digit -+|
+ --- not a digit
这会导致第一个先行模式失败。
您可以使用三个 lookaheads 更清晰地表达验证规则:
- "长度大于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)}`);
}
请注意,此正则表达式不需要 个字母 。严格按照要求,唯一明确要求的是数字。由于未指定任何其他输入的类型,因此它可以是任何类型(使用 .
)。编写正则表达式时最好不要做太多假设,否则你可能会阻止合法输入。