【问题标题】:regex with 3 upper case and lower case带有 3 个大写和小写的正则表达式
【发布时间】:2016-04-11 12:13:43
【问题描述】:

我需要正则表达式来检查字符串是否至少有 3 个大写字母、3 个小写字母和至少一个特殊字符。

目前我有这个:

^(?=.*[a-z]{3,})(?=.*[A-Z]{3,})(?=.*\d)(?=.*(_|[^\w])).+$

但它只有在角色彼此相邻时才有效。

应该匹配的示例:

S4L4S6na#a

【问题讨论】:

    标签: regex


    【解决方案1】:

    这会起作用

    (?=(.*[A-Z]){3})(?=(.*[a-z]){3})(?=.*(_|[^\w]))
    

    如果你还想包含数字

    (?=.*\d)(?=(.*[A-Z]){3})(?=(.*[a-z]){3})(?=.*(_|[^\w]))
    

    Regex Demo

    根据 cmets 进一步优化

    您可以使用non-greedy 方法,它优化了上述regex 并使用[\W_] 而不是(_|[^\w])

    (?=(.*?[A-Z]){3})(?=(.*?[a-z]){3})(?=.*?[\W_])
    

    Reason for alternation being slower than character class

    【讨论】:

    • 认为如果你使.* non-greedy,你会得到更好的性能。 IE。 .*?。 (可能不是问题,但是... ;)
    • 是的,添加 ? 使其从 776 步下降到 353 步。然后附加 .+ 使其下降到 135 步。
    • 对于那些喜欢优化的人:(_|[^\w]) > [\W_]
    • @WiktorStribiżew 感谢您的告知..不知道这件事..已更新并解释原因
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多