2011-01-19 93 views
0

下面的正则表达式现在写成需要大写字母。我刚才被告知大写字母是可选的,但不是必需的。如何在不改变任何其他参数的情况下编写这个正则表达式来不至少需要一个大写字母。需要此正则表达式不要求至少有1个大写字母

/^(?:(?!([a-zA-Z0-9-().&@?""#,+''\s\/])\1\1)[a-zA-Z0-9-().&@?""#,+''\s\/]){7,}$/ 
+2

**这**是为什么你不写出巨大的不可理解的正则表达式,但只有当他们产生最可读的解决方案时使用它们的小剂量。 – delnan 2011-01-19 21:47:08

回答

4

这正则表达式已经不需要一个大写字符。它所坚持的唯一“有趣”的事情是,字符串不能以重复3次的同一个事物(即相同的字符)开始,而整个字符串至少需要7个字符长。

此外,正则表达式中单引号和双引号字符的倍数是不必要的。

3

该正则表达式中没有任何内容需要大写字母。该正则表达式的要求是:

  • 至少7个字符长。
  • 仅包含大写和小写字母,数字0-9,符号-().&@?"#,+',空格或/
  • 不是以连续3个相同的字符开头。 (作者可能希望此检查适用于整个密码,但它不会)。

如果我没有弄错,这似乎是用于密码验证。由于以下几个原因,这对于正则表达式的使用很差。

  1. 这很难读。正确的检查是什么?这一大堆人物实际上做了什么?如果你不是一个正则表达式专家,这是胡言乱语。

  2. 它有几个需求塞进一个大的正则表达式。如果检查被分成几行代码会更容易阅读和更易于维护:

    if (password.length < 7)     reject("Too short."); 
    if (numRepeatedCharacters(password) >= 3) reject("Too repetitive."); 
    if (numDigits(password) < 1)    reject("Digit required."); 
    if (numSymbols(password) < 1)    reject("Symbol required."); 
    // etc. 
    
  3. 它包含一个字符的白名单,而不是黑名单。请勿将字符列入白名单。没有理由阻止用户使用你没有想到的字符。如果他们想使用星号,百分号,重音字母等,该怎么办?你会因为没有良好的安全原因而拒绝这些角色。

相关问题