2011-07-18 91 views
6

我打算写一个正则表达式如果字符串包含至少n个不同类别的字符,将只匹配的至少n。我打算用这个强迫我的用户创建高强度密码,并要检查,如果密码包含以下至少3:正则表达式匹配M组

  • 人物
  • 资本人物
  • 特殊字符

如果所有这些类都存在,编写一个匹配的正则表达式就很容易使用lookaheads。但是,我无法将自己的头围绕“至少3个”部分。这甚至有可能(以一个很好的,紧凑的表达),还是我必须创建一个怪物表达式?

回答

6

我认为这会比列出4中3个的每个可能组合更紧凑。它使用负向前视来确保整个字符串不仅包含您列出的字符类中的一个或两个:

(?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).* 

为了,这里的组是:

  • 下部和/或上部
  • 下和/或数字
  • 下和/ O ř特殊
  • 上和/或数字
  • 上部和/或特殊
  • 数字和/或特殊

此正则表达式将失败,如果整个字符串(因为在负先行的$)只包含来自上述任何组的字符。

+1

我非常喜欢这种方法。甚至没有考虑颠倒逻辑。非常感谢,非常聪明! –

+1

这个表达式是否允许空格? – Rookian

+1

它的确如此,[密码允许空格并不少见](http://stackoverflow.com/questions/632167/should-users-be-allowed-to-entered-a-password-with-a-space-在最开始,或-E)。如果你需要一个不允许有空格的版本,把'。*'结尾改为'\ S *'。 –

2

你必须写对的4 3每个可能的组合(四个表达式总共)的表达式,然后|单独表达在一起,以便它们在满足至少一个原始表达式时通过。

+1

这是4个表达式每次约3/4当前的正则表达式的长度,所以你的最终结果将是约3×当前的正则表达式的大小。不错。 – Paulpro

+0

我希望我不必这样做。我认为它并不干净,特别是因为我将不得不一遍又一遍地重写相同的类。谢谢你的澄清。 –

+0

为什么不干净?创建一个方法来完成它并重新使用它。这比拥有一个巨大的不可读的RegEx好多了。 –

0

你怎么看待这个解决方案是什么?

var str='23khkS_s'; 

var countGroups=0; 
if(str.match(/[a-z]+/)) 
    countGroups++; 
if(str.match(/[A-Z]+/)) 
    countGroups++; 
if(str.match(/[0-9]+/)) 
    countGroups++; 
if(str.match(/[[email protected]#$%*\(\)]+/)) 
    countGroups++; 

console.log(countGroups); 

代替使用1怪物状表达的可以使用4小RE。然后与变量countGroups一起工作,其中包含一些变化的字符组。 我希望这是有益的

+0

如果他总是控制整个解决方案,这会很好,但我怀疑他所能做的只是将正则表达式放入文本字​​段中进行配置。 –