【问题标题】:Regex combination for code optimization用于代码优化的正则表达式组合
【发布时间】:2017-12-14 23:16:06
【问题描述】:

是否可以使用正则表达式组合这些条件?

至少包含 8 个字符,并至少包含以下三个:

  • 大写字母 (A-Z)
  • 数字 (0-9)
  • 小写字母 (a-z)
  • 特殊字符 (,!$%^&*()_+|~-=`{}[]:";'?,/)

【问题讨论】:

  • 您究竟想优化代码是为了什么?一般来说,您应该为简单而优化,这意味着不要将这些组合到一个正则表达式中。
  • 至少 3 个”是正则表达式糟糕的地方之一。更好地独立评估每个标准,并用您的宿主语言编写您的业务规则

标签: regex


【解决方案1】:

是的,这是可能的。
您使用的正则表达式引擎必须支持条件(?(cond)yes|no)

话虽如此,如果您使用任何其他字符,则使用点 .

^(?=.{8})(?:.*?(?:(?(1)(?!))([A-Z])|(?(2)(?!))([a-z])|(?(3)(?!))([0-9])|(?(4)(?!))([!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~]))){3,4}.*$

https://regex101.com/r/Iyj5hJ/1

展开

 ^                                             # BOS
 (?= .{8} )                                    # At least 8 chars
 (?:                                           # Require 3 out of the 4 types
      .*? 
      (?:
           (?(1)
                (?!)
           )
           ( [A-Z] )                                     # (1), Upper
        |  
           (?(2)
                (?!)
           )
           ( [a-z] )                                     # (2), Lower
        |  

           (?(3)
                (?!)
           )
           ( [0-9] )                                     # (3), Digit
        |  
           (?(4)
                (?!)
           )
           ( [!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~] )       # (4), Special
      )
 ){3,4}
 .* 
 $                                             # EOS

如果您只想在 ascii 范围内允许非空白,请使用此

^(?=.{8})(?:[a-zA-Z0-9!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~]*?(?:(?(1)(?!))([A-Z])|(?(2)(?!))([a-z])|(?(3)(?!))([0-9])|(?(4)(?!))([!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~]))){3,4}[a-zA-Z0-9!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~]*$

展开

 ^                                             # BOS
 (?= .{8} )                                    # At least 8 chars
 (?:                                           # Require 3 out of the 4 types
      [a-zA-Z0-9!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~]*? 
      (?:
           (?(1)
                (?!)
           )
           ( [A-Z] )                                     # (1), Upper
        |  
           (?(2)
                (?!)
           )
           ( [a-z] )                                     # (2), Lower
        |  

           (?(3)
                (?!)
           )
           ( [0-9] )                                     # (3), Digit
        |  
           (?(4)
                (?!)
           )
           ( [!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~] )       # (4), Special
      )
 ){3,4}
 [a-zA-Z0-9!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~]* 
 $    

【讨论】:

  • 您没有转义特殊字符集中的/ 字符。
  • @EganWolf - 它不需要转义。它不是一个特殊字符。仅当它用作字符串正则表达式分隔符时才需要对其进行转义,即正则表达式文字(JS、Perl 或 Php 等)。我们/我只在上下文中显示正则表达式。如果它是原始的(这是)你看到的就是 engine 解析的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多