gpt4 book ai didi

.net - 验证密码的最小/最大长度

转载 作者:行者123 更新时间:2023-12-02 21:03:35 25 4
gpt4 key购买 nike

我对正则表达式还很陌生,才刚刚在学校开始学习。我收到了第一份作业,并且完成得相当好。

让我解释一下,以便我的代码有意义......任务是让我的 .NET Regex Tester 在文本中搜索密码。这些密码不能包含任何空格(所以我使用了 \S) 不能以数字或下划线开头,所以我使用了 (?m:^([^_|^0- 9]{1})不能以两个不同的字符结尾

(?<finalTwo>(?i:\S{1}))(?i:\<finalTwo>)

必须包含至少一位数字,所以我使用了前瞻。现在,问题是,代码现在非常困惑。

(?=.*\d)(?m:^([^_|^0-9]{1})(\S*)(?<finalTwo>(?i:\S{1}))(?i:\<finalTwo>))

我还必须添加一件事,密码的长度必须在 8 到 20 个字符之间。我知道我必须使用 {8,20} (我认为),但问题是,无论我在哪里输入它,它都会完全杀死搜索。

有人知道我该如何解决这个问题吗?

非常感谢。

最佳答案

[免责声明,这是一个很长的答案!]

我将从字符限制开始。

您必须使用(?<!\S)(?!\S)指示密码的开始和结束并使用 \S{8,20}实际密码:

(?m)(?<!\S)\S{8,20}(?!\S)

正如您可能已经知道的那样 (?m)用于多行( ^$ 分别匹配行的开头和结尾,而不是此模式下的字符串)。

(?<!\S)确保密码前没有非空白字符。

(?!\S)确保密码后没有非空白字符。

现在我们添加一些限制:

不能以数字或下划线开头:(?![0-9_])密码开头的否定前瞻:

(?m)(?<!\S)(?![0-9_])\S{8,20}(?!\S)

必须至少包含一位数字:(?=\S+[0-9])密码开头的正向前瞻:

(?m)(?<!\S)(?![0-9_])(?=\S+[0-9])\S{8,20}(?!\S)

必须以相同的字符结尾:您必须捕获倒数第二个字符并使用反向引用。您可以更改 \S{8,20}部分为\S{6,18}(\S)\1为此:

(?m)(?<!\S)(?![0-9_])(?=\S+[0-9])\S{6,18}(\S)\1(?!\S)

现在应该很好了。

<小时/>

现在到你的正则表达式:

(?m:^([^_|^0-9]{1})

首先,{1} 是多余的,因为如果删除它,它根本不会改变任何内容。

(?m:^([^_|^0-9])

其次,括号不平衡。不确定那应该是什么,但我猜第一个括号不是故意的。

(?m:^[^_|^0-9])

接下来,字符类 [^_|^0-9]匹配除 _ 之外的任何字符, | , ^或范围 0-9 。我确信密码可以| 开头或^ 。元字符 |在字符类中失去了意义!你可以使用这个:[^_0-9]相反,这将变成:

(?m:^[^_0-9])

可以使用这个,但是你必须记住这是密码中的第一个字符;因为您需要尊重的字符范围为 8 到 20 个字符,而它只是更改为 7,19。唯一剩下的就是它也接受一个空格。您可以在角色类中放置一个来避免这种情况:

(?m:^[^_0-9 ])

好的,现在看起来好多了,下一张:

(?<finalTwo>(?i:\S{1}))(?i:\<finalTwo>)

首先是一个命名的捕获组,好的,还有一个启用了不区分大小写模式的非捕获组(不是很有必要,因为我们在正则表达式中没有任何字母)和 \S{1}在该非捕获组内。再次,{1}是多余的。删除它和 (?i)模式,这变成:

(?<finalTwo>\S)(?:\<finalTwo>)

这还不错,如果它匹配最后两个字符,它确实可以工作。

(?=.*\d)

效果很好。您可能想要查找除 0-9 以外的字符那\d匹配,但如果你不介意,那就差不多了;最好使用\S而不是.以防万一文本中有两个密码彼此相邻并用空格分隔,这可能会使事情不像您预期​​的那样。

(\S*)

这部分或多或少还可以。没有任何限制。

(?=\S*\d)(?m:^[^_0-9 ])(\S*)(?<finalTwo>\S)(?:\<finalTwo>)

好吧,现在记住 (?m:^[^_0-9])取一个字符,然后 (?<finalTwo>\S)(?:\<finalTwo>)需要两个字符,总共 3 个字符。因此您施加的限制是:

(?=\S*\d)(?m:^[^_0-9 ])(\S{5,17})(?<finalTwo>\S)(?:\<finalTwo>)

它几乎可以工作,你只需要添加一些东西来防止较长密码的部分匹配。您通常可以使用单词边界 \b但没有提到任何有关符号的内容,因此假设像 $@4*&AUn++ 这样的密码会更安全。也是允许的,这就是单词边界失败的地方。这就是为什么我建议使用否定环视。

关于.net - 验证密码的最小/最大长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com