【问题标题】:How to loop a regex.match or add a range to String.Contains()如何循环 regex.match 或向 String.Contains() 添加范围
【发布时间】:2016-05-12 20:21:34
【问题描述】:

我已经建立了一个密码生成器:

Public Function PassGen()

    Dim pool As String = "0123456789abcdefghijklmnopqrstuvwxzyABCDEFGHIJKLMNOPQRSTUVWXYZ+@*#%&/()?!$-"
    Dim rnd As New Random
    Dim result As String
    Dim i As Integer = 0

    Do Until i = 10
        result &= pool(rnd.Next(0, pool.Length))
        i = i + 1
    Loop

    Return result

End Function

现在我想检查生成的密码是否包含数字、大小写和特殊字符。如果生成的密码不包含这4个东西,它应该生成另一个密码并再次检查,等等。

我试图循环一个Regex.Match

    Dim text As String = PassGen()

    Do Until Regex.Match(text, "^[0-9]$")

        text = PassGen()

    Loop

什么不起作用,因为它不会让我循环 regex.match()

我也试过String.Contains()。但据我所知,包含方法只能检查一个字符串,而不能检查范围或类型(如整数)。

是否有可能检查我的这四个字符串范围的密码,或者我是否必须修改我的函数,它必须使用其中一个?

【问题讨论】:

  • 您的正则表达式只检查 one 位。是的,它可以检查所有那些 四个字符串范围。你能提供一些有效的密码样本吗?最大长度是多少?
  • Do Until i = 10 密码长度始终为 10。有效密码为:xE3)g21v%P
  • 您可以尝试使用Do Until System.Text.RegularExpressions.Regex.IsMatch(text, "(?s)^(?=.*\d)(?=.*\p{Ll})(?=.*\p{Lu})(?=.*\W)")
  • @WiktorStribiżew 非常感谢。成功了!

标签: regex vb.net string passwords


【解决方案1】:

您可以在 VB 中使用 LIKE 关键字。 LIKE 就像一个内置在 VB.NET 中的迷你正则表达式。

If text Like "*[A-Z]*" AndAlso text Like "*[a-z]*" AndAlso text Like "*[0-9]*" AndAlso text Like "*[+@*#%&/()?!$-]*" Then
    ' it is a valid password

Else
    ' password doesn't match required constraints... do whatever to regenerate it here... 

End If

【讨论】:

  • 感谢您的补充意见。我不知道这个命令,它肯定会在未来有所帮助:)
  • 由于不是每个人都能完整阅读我的答案,所以我将在此处添加注释:\W 匹配 all 特殊符号,而使用Like,我们只能定义几个(我们记得的)。
  • 是的,但是LIKE 比 Regex 快十几倍,因为它不使用 Regex 引擎。我避免使用正则表达式,其中字符串操作函数或 LIKE 关键字就足够了。
【解决方案2】:

您可以使用一个正则表达式来检查密码强度:

Do Until System.Text.RegularExpressions.Regex.IsMatch(text, "(?s)^(?=.*\d)(?=.*\p{Ll})(?=.*\p{Lu})(?=.*\W)")

\W 匹配除字母、数字和_ 之外的所有特殊字符,因此与手动定义[+@*#%&/()?!$-] 之类的字符类相比,它的范围更广。

(?s) 是一个内联单行修饰符,用于强制 . 也匹配换行符。 \d 匹配数字,\p{Ll} 匹配小写字母,\p{Lu} 匹配大写字母。前瞻(?=...) 在成功时一个接一个地执行。如果其中一个返回false,则整个匹配失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2017-04-22
    • 1970-01-01
    • 2021-09-08
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多