【问题标题】:Building Password Validation Regex Dynamically动态构建密码验证正则表达式
【发布时间】:2014-01-30 17:16:58
【问题描述】:

我正在处理一些遗留代码,找到了一个正则表达式,并希望有人可以为我剖析它:

((?=.*[^a-zA-Z])(?=.*[a-z])(?=.*[A-Z]).{8,})

我知道它在做什么,但不完全确定它是如何做到的。 “。”究竟是什么?满足条件后做什么?

我正在尝试添加一些代码来动态生成这个正则表达式。也就是说,如果一堆配置说密码可以做任何事情,我想返回一个正则表达式它将在 groovy 中为所有 .matches() 调用返回 true。 到目前为止,我刚刚完成字符串格式,所以创建的正则表达式是“(。)”,但是当使用matches()调用时返回false。

感谢您的帮助!

【问题讨论】:

  • . 将精确匹配 1 个不是换行符的字符。如果你想允许任意数量的这些字符(包括空字符串),那么你需要.*,一个或多个.+,恰好x .{x},在x 和y 之间.{x,y},至少x @987654327 @ 或最多 x .{,x}。我建议访问 rexegg.com(下面我的答案中的链接)并浏览那里的信息;听起来如果你至少没有掌握正则表达式的基本句柄,你会经常回到这里。

标签: regex groovy


【解决方案1】:

这是为您分解的解释和几个示例字符串。

http://regex101.com/r/oZ6dK4

这里的 tl;dr 正在使用前瞻断言,它要求至少在字符串中的某个位置:

  • 小写字母[a-z]
  • 一个大写字母[A-Z]
  • 非字母[^a-zA-Z]
  • 并且必须至少为 8 个字符 {8,}

对我来说,这看起来像是一个密码要求验证器。

将匹配的字符串:

asdfsdklj2-3049-09AS
09809LK2JL23Lsdf

不匹配的字符串:

asdfsdf
2398-02934
23Abs

至于您关于点 (.) 的问题:它不是句点,而是匹配除换行符以外的任何内容的正则表达式特殊字符。 (在 regex101 解释中,您可以看到它声明 .{8,} matches any character (except newline))。在这种情况下,~"(.)".matches() 返回 false 的原因是因为它需要至少 8 个字符才能进行验证。

【讨论】:

  • 感谢您的回复,我得到了一样多。为什么句号会在正则表达式中?为什么 ~"(.)".matches() 对所有字符串都返回 false?
  • 这不是句点,它是一个正则表达式特殊字符,可以匹配除换行符以外的任何内容。在这种情况下,它失败的原因是它需要至少 8 个字符才能进行验证。
  • 我根据一些配置更改了正则表达式。假设正则表达式变为 (.),那么这将失败。这没有长度限制。你知道为什么会失败吗?
  • 把它放到 regex101 中,你就会明白为什么。 (.) 只有一个字符,但它没有开始或结束字符串锚点(^$)。因此,它有效地匹配任何/所有字符的真值。 regex101.com/r/cE4tY2
  • Exactamundo,在配置已关闭所有密码验证的情况下,我想要那个。但出于某种原因在 groovy 中:~".".matcher().matches() 返回 false
【解决方案2】:

这将检查以确保密码包含非字母字符,它包含至少一个小写大写字母字符,最后确保整个字符串的长度至少为 8 个字符。后一部分是 . 出现的地方——匹配整个字符串并确保它是 8+ 个字符。

【讨论】:

    【解决方案3】:

    (?=.*[^a-zA-Z) - 检查密码中某处是否有非字母字符

    (?=.*[a-z]) - 检查密码中某处是否有小写字符

    (?=.*[A-Z]) - 检查密码中某处是否有大写字符

    .{8,} - 检查至少有 8 个字符。

    ?= 是积极的前瞻。此括号中的正则表达式必须匹配,并且必须出现在输入中的此位置之后。

    查看rexegg.com 以获取各种有用的正则表达式信息和非常有用的快速参考。

    【讨论】:

    • 哦,好的,谢谢!所以 。是长度的一部分吗?说没有长度限制,((?=.*[^a-zA-Z])(?=.*[a-z])(?=.*[A-Z]))还会做其他限制吗?
    • . 匹配除换行符以外的任何字符; {8,} 表示“8 次或更多次”,它应用于 .。你仍然需要.+ 来代替.{8,}+ 表示 1 次或多次,并且等同于 {1,}
    猜你喜欢
    • 2011-05-06
    • 2016-10-19
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多