Javascript 用于多个条件的单个正则表达式模式

Javascript 用于多个条件的单个正则表达式模式,javascript,regex,Javascript,Regex,问题不与其他SO问题重复,因为答案与列出的标准不匹配,请参考下文 使用regex模式为输入文本实现的标准是 至少支持一个大写字母 至少支持一个小写字母 至少支持列出一个特殊字符-->@%$ 支持至少一个数字 没有开始和结束标准 试图用下面的单个正则表达式实现 ^( (\w+\d+[@%\$]+) | (\d+[@%\$]+\w+) | ([@%\$]+\d+\w+) | (\w+[@%

问题不与其他SO问题重复,因为答案与列出的标准不匹配,请参考下文

使用regex模式为输入文本实现的标准是

  • 至少支持一个大写字母
  • 至少支持一个小写字母
  • 至少支持列出一个特殊字符-->@%$
  • 支持至少一个数字
没有开始和结束标准

试图用下面的单个正则表达式实现

^(
  (\w+\d+[@%\$]+)
     |
     (\d+[@%\$]+\w+)
        |
        ([@%\$]+\d+\w+)
             |
             (\w+[@%\$]+\d+)
)$
问题是

对至少一个大写字母的支持无效。 我非常肯定,这不是构建regex模式的好方法

请帮助我在单个正则表达式模式中实现这些标准

通过标准 Test@123
tesT@123
@123测试
123@Test
TTTTeeess@@$$$1111122222
@@@@$$$1111TTT@$$esss

不合格标准 测试(无特殊字符)
@123
123
@
T
测试
test@123(无大写字母)
Test@123&(“&”在模式中不受支持)
@123测试

@TTT123(无小写)

您只需使用这个基于前瞻的正则表达式:

^(?=.*?[A-Z])(?=.*?[a-z])(?=\D*\d)(?=.*?[$@%])[\w$@%]+$
像这样尝试(将
\w
更改为
[a-zA-Z\d]
,因为您可能不想要
\u
签名):


演示:

为什么要求使用单个正则表达式?您可以使用look aheads来完成,但在这一点上,您基本上运行了多个正则表达式。如果你把它分成四个正则表达式,你可以给每个正则表达式取一个有意义的名字。谢谢你,伙计。我将接受anubhav的答案,因为它与下划线匹配(逻辑上更强,除非符合我的通过标准)。您应该将所有
*
更改为
*?
,这样会更快。我认为优化在这里不会起任何作用。比较regex调试器中的。即使你禁用了优化,懒惰的需要34步,贪婪的需要3679步。@AMDcze:你可能是对的,但我已经读过一些正则表达式专家在这里声称贪婪的正则表达式运行得更快。但我没有机会运行任何严肃的基准测试。如果您搜索并找到了它,请告诉我。对我来说,这是一本有趣的书。是的,否定肯定比
*
*?
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d)(?=.*?[@%$])[a-zA-Z\d@%$]+$