Php 正则表达式将字符串与3/4子模式匹配

Php 正则表达式将字符串与3/4子模式匹配,php,regex,preg-match,Php,Regex,Preg Match,我有以下正则表达式: #^(?=.{8,20})(?=.[a-z])(?=.[a-z])(?=.[0-9])(?=..\W)*$# 此正则表达式匹配一个字符串,该字符串至少包含a-z a-z 0-9组和特殊字符组中的一个 是否可以编写一个正则表达式来匹配4个子模式中至少3个(一个preg_匹配,而不是多个) 例如,字符串应匹配A-Z、0-9和A-Z或A-Z、0-9和特殊字符。 但是也应该允许4/4。当然,你只能有四个条件中的三个,只要写一个有所有可能的替代: /^(?:(?=.*[a-z])(

我有以下正则表达式:

#^(?=.{8,20})(?=.[a-z])(?=.[a-z])(?=.[0-9])(?=..\W)*$#
此正则表达式匹配一个字符串,该字符串至少包含a-z a-z 0-9组和特殊字符组中的一个

是否可以编写一个正则表达式来匹配4个子模式中至少3个(一个preg_匹配,而不是多个)

例如,字符串应匹配A-Z、0-9和A-Z或A-Z、0-9和特殊字符。
但是也应该允许4/4。当然,你只能有四个条件中的三个,只要写一个有所有可能的替代:

/^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*\W)|...|...|...).{8,20}$/
我只写了两个备选方案,太复杂了。您需要自己填写
部分


我建议你不要用一个正则表达式。它变得复杂并且容易出错。分别测试条件并计算匹配的数量。

这是密码策略吗?@Jack:您的编辑破坏了正则表达式。我的只是装饰性的。@TimPietzcker最初的标记也有反斜杠。@Jack:你删除了所有的
*
。@TimPietzcker嗯,真的。我的坏:(
*^
不是问题(但没用)@TimPietzcker我关心的更多的是
\\\code>部分,但它似乎只存在于原始问题源代码中,而没有显示。只有当我将正则表达式编辑为代码格式时,才会出现反斜杠。它假设它们不在OPs原始代码中。Ehm在开头和结尾没有反斜杠。我只是添加了它们为了逃出,为了逃出,为了逃出,为了逃出,为了逃出,为了逃出,为了逃出,为堆积溢出……但是,为了逃出,为了逃出,为了逃出,为了逃出,为了逃出,为了为了逃出,为了逃出,为了逃出,为了逃出,为了逃出堆积溢出…但是是的regex工程。但是是的。但是,为了逃出,为了逃出,为了逃出,为了逃出,为了逃出,为了为了逃出,为……为了为了为了为了为了为了避免,为了逃出,为了为了为了避免……为了为了为了为了为了为了为了为了避免,为了避免,为了避免……为了为了为了避免……为了避免,为了避免,为了避免,为了避免……为了避免……为了避免……为了避免……的,为了避免,为了避免,为了避免,为了避免,为了避免,为了避免,为了避免……为了避免……为了避免……为了为了避免……为了避免……为了避免……的,为了避免……的,为了为了为了为了避免,为了避免,为了避免,为了避免,为了为了为了.[a-z])(?=.[0-9])(?=...\W)|(?=.[a-z])(?=.[0-9]))(?=.*.\W)(?=.[A-Z])|(?=.[0-9])(?=.*.[A-Z])|(?=.[A-Z])(?=.[A-Z])(?=.[A-Z])(?=.[A-Z])但它正在工作:@raffis,因为我建议在不同的测试中对其进行拆分。可能是的,但我无法更改当前版本中的代码,所以我需要配置我拥有的:)