V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

正则表达式求助

  •  
  •   LeeReamond · 2021-02-27 01:14:00 +08:00 · 1045 次点击
    这是一个创建于 1401 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    3 条回复    2021-02-27 02:34:12 +08:00
    witfun
        1
    witfun  
       2021-02-27 01:57:03 +08:00 via Android
    (?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{7,15}$
    这个么?网上随便搜了一个
    LeeReamond
        2
    LeeReamond  
    OP
       2021-02-27 01:59:07 +08:00
    @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  
       2021-02-27 02:34:12 +08:00
    不知道你是什么语言的正则 ... 我写个通用的给你 ...

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

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

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

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

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

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

    如果你非要正写的版本我也能写 ... 打出来费点劲罢了 ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1164 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:58 · PVG 07:58 · LAX 15:58 · JFK 18:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.