【问题标题】:Regex to match string with 3/4 sub pattern正则表达式匹配字符串与 3/4 子模式
【发布时间】:2013-03-04 16:29:01
【问题描述】:

我有以下正则表达式:

#^(?=.{8,20})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).*$#

此正则表达式匹配包含至少一个组 a-z A-Z 0-9 和特殊字符的字符串。

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

例如,字符串应匹配 A-Z、0-9 和 a-z A-Z、0-9 和特殊字符。 但也应该允许 4/4。

【问题讨论】:

  • 这是密码策略吗?
  • @Jack:您的编辑破坏了正则表达式。我的只是化妆品。
  • @TimPietzcker 原来的 Markdown 也有反斜杠。
  • @Jack:你删除了所有*...
  • @TimPietzcker 嗯,确实。我的坏:(

标签: php regex preg-match


【解决方案1】:

当然你只能有四个条件中的三个,只要写一个包含所有可能性的替代:

/^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*\W)|...|...|...).{8,20}$/

我只写了2个替代方案,太复杂了。 ...部分需要自己填写。

我建议您不要使用单个正则表达式来执行此操作。它变得复杂并且容易出错。分别测试条件,统计匹配的数量。

【讨论】:

  • .*^ 不是问题(但没用)。
  • @TimPietzcker 我的担忧更多是关于\# 部分,但似乎它只存在于原始问题源代码中,但未显示。只有当我将正则表达式编辑为代码格式时,才会出现反斜杠。它假定它们不在 OP 的原始代码中。
  • 嗯,开头和结尾没有反斜杠。我只是添加它们以逃避# for stackoverflow ...但是是的,正则表达式有效。啊,明白了,只需用 | 添加所有可能的解决方案。但这是一个巨大的正则表达式^^:#^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[ a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W)|(?=.*[a-z])(?=.*[A-Z]) (?=.*\W)|(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?=.*[0-9])|(?= .*[a-z])(?=.*[0-9])(?=.*\W)|(?=.*[a-z])(?=.*[0-9])(?=. *\W)(?=.*[A-Z])|(?=.*[0-9])(?=.*\W)(?=.*[A-Z])|(?=.*[0 -9])(?=.*\W)(?=.*[A-Z])(?=.*[a-z]) ).{8,20}$# 但它正在工作:)
  • @raffis,因此我建议将其拆分为不同的测试。
  • 可能是的,但是我不能在当前版本中更改我的代码,所以我需要配置我所拥有的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2015-11-14
  • 2015-06-29
相关资源
最近更新 更多