LeeReamond
V2EX  ›  问与答

正则表达式求助

  •  
  •   LeeReamond · Feb 27, 2021 · 1478 views
    This topic created in 1915 days ago, the information mentioned may be changed or developed.

    如题,网站注册密码的要求,我记得是能通过一行正则表达式实现的,但是我比较菜不会写,同时又忘了之前在哪里看到正确版本了。。。烦请有缘人解惑一段神秘代码

    要求:实现一段正则表达式匹配以下条件的字符串:

    • 长度大于或等于 8 位
    • 至少包含一位大写字母
    • 至少包含一位小写字母
    • 至少包含一位数字
    • 至少包含一位特殊符号

    ===================

    以上是基础需求,我印象中正则表达式是能实现的。

    还有一个进阶需求是仅允许匹配 ascii128 以内的可读范围,即密码中不要出现什么中文之类的特殊符号,这个不知道能不能加入上述正则表达式里。

    3 replies    2021-02-27 02:34:12 +08:00
    witfun
        1
    witfun  
       Feb 27, 2021 via Android
    (?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{7,15}$
    这个么?网上随便搜了一个
    LeeReamond
        2
    LeeReamond  
    OP
       Feb 27, 2021
    @witfun 感谢,自己搜到了
    '^' # begin string
    '(?=.*?[A-Z])' # at least one uppercase letter
    '(?=.*?[a-z])' # at least one lowercase letter
    '(?=.*?\d)' # at least one digit
    '(?=.*?[!@#$%^&*?])' # at least one special character
    '[A-Za-z\d!@#$%^&*?]' # only the given characters
    '{8,20}' # between 8 and 20 characters long
    '$' # end string
    Sunyanzi
        3
    Sunyanzi  
       Feb 27, 2021
    不知道你是什么语言的正则 ... 我写个通用的给你 ...

    通常情况下像这类需求都是放一堆前瞻 ... 我估计你见过的正确版本也是这样 ...

    但对密码而言我个人更喜欢反着写 ... 如下 ...

    /^(.{0,7}|[^A-Z]*|[^a-z]*|[^0-9]*|[a-zA-Z0-9]*)$|[^\x20-\x7E]+/

    这种写法的好处是看起来更清晰而且更短 ... 执行效率理论上也更高一些 ...

    前面的五项我是按照你给的顺序写的 ... 后面控制了字符范围是 ASCII 32 ~ 127 ... 从空格开始 ...

    需要注意的是这个正则匹配的是所有不合法的密码 ... 只有不匹配才说明字符串满足你的需求 ...

    如果你非要正写的版本我也能写 ... 打出来费点劲罢了 ...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1096 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    ♥ Do have faith in what you're doing.