0

我需要使用具有以下要求的 javascript 匹配密码字段:

  1. 应该是带有至少一个特殊字符的字母数字。
  2. 不允许有空格
  3. 应最少 10 个字符,最多 20 个字符。
  4. char 的重复次数不超过 2 次。
  5. ~,'.:;^| 不允许

我有一个正则表达式
var 密码 = /^(?=. [0-9])(?=. [!@#$%^& ])[a-zA-Z0-9!@#$%^& ]{ 10,20}$/; 我该如何解决这个问题?

4

4 回答 4

1

这可能是所需的正则表达式

^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[A-Za-z\d!@#$%^&|]{10,20}$

(?=.*[!@#$%^&])确保至少出现一次列出的字符。

(?!.*(.).*\1.*\1)确保没有字符重复超过两次。

[A-Za-z\d!@#$%^&|]{10,20}匹配字符类中出现的 10-20 个字符。

于 2013-04-02T09:45:16.060 回答
1

我会编写单独的规则(可能对所有规则都使用正则表达式 - 为了一致性 - 除非性能是一个很大的问题),每个规则都与您列表中的规则直接相关。

编码

var pw = "asddfak@kjg";

/* Should be alpha numaric with at least one special character. */
console.log(null !== pw.match(/[@+#$]/));

/* no spaces to be allowed */
console.log(null !== pw.match(/^\S+$/));

/* should be minimum 10 char and max 20 chars. */
console.log(null !== pw.match(/^.{10,20}$/));

/* No repeate of char more than 2 times. */
console.log(null === pw.match(/(.)(.*\1){2}/));

/* ~,'.:;^| are not allowed */
console.log(null !== pw.match(/^[^~,'.:;^|]+$/));

尽管可以使正则表达式更简洁,但我认为使规则更符合您的意图更易于维护。如果性能是一个重要问题(通常不是这种事情),那么我会避免使用正则表达式,并使用字符串方法实现规则。

正则表达式解释

/           // start regex pattern
[           // open character class
@+#$        // match one of these `special` characters
]           // close character class
/           // end regex pattern 

/           // start regex pattern
^           // start matched string
\S+         // one or more (`+`) not spaces (`\S`)
$           // end matched string
/           // end regex pattern 

/           // start regex pattern
^           // start matched string
.{10,20}    // between 10 and 20 of any character (`.`)
$           // end matched string
/           // end regex pattern 

/           // start regex pattern
(.)         // any character captured as group 1
(.*\1){2}   // followed by zero or more of anything (`\.*`) and then the captured group 1 (`\1`) two times (`{2}`)
/           // end regex pattern 

/           // start regex pattern
^           // start matched string
[           // open character class
^~,'.:;^|   // not (`^`) one of these characters
]+          // close character class
$           // end matched string
/           // end regex pattern 

ps 你应该用你使用的正则表达式保留很多评论,因为与书籍不同,它们写起来比读起来容易得多

于 2013-04-02T09:53:21.683 回答
0

这应该有效:

/^(?=.*?[!@#$%^&])(?:([a-zA-Z0-9!@#$%^&])(?!.*?\1.*?\1)){10,20}$/

(如果重复超过 2 次,则意味着同一个字符不能出现三次)

解释:
第一个条件:一开始,我们将第一次遍历整个字符串,直到找到一个特殊字符,一旦我们找到它,我们就停止,如果我们没有,它会失败(来源):(?=.*?[!@#$%^&])
第二个条件:无事可做,[a-zA-Z0-9!@#$%^&]无论如何不允许空格
第三个条件:量词:{10,20}
第四个条件:微妙的一个:当我们通过字符串时,对于捕获的每个字符,我们检查它是否重复两次(相同来源):(?!.*?\1.*?\1)
第五个条件:与空格相同

于 2013-04-02T09:44:45.730 回答
0

根据您的要求中的 5 件事,这是您需要的确切模式

^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[^\s~,'.:;^|]{10,20}$
于 2013-04-02T10:20:40.897 回答