我需要一个正则表达式来测试一个字符串
- 最少 14 个字符 - 有效字符为
A-Za-z0-9#,.-_
- 这 14 个字母中至少有 6 个字母
- 这 14 个数字中至少有 2 个
有没有一种方法可以将其包装在一个正则表达式中(目前我有一个 javascript 和 php 函数执行三个单独的测试,一个是总共 14 个,另一个是至少有两个数字,另一个是至少有 6 个字母。
所以以下内容是有效的:
- blabla2bla2f54a(有效 > 总共 14 个,至少有 6 个字母,至少有 2 个数字)
- thisIsNotValidAtAll(无效,因为少于 2 个数字)
最佳答案
简单!首先让我们看一下 PHP 中的注释版本:
$re = '/# Match 14+ char password with min 2 digits and 6 letters.
^ # Anchor to start of string.
(?=(?:.*?[A-Za-z]){6}) # minimum of 6 letters.
(?=(?:.*?[0-9]){2}) # minimum of 2 numbers.
[A-Za-z0-9#,.\-_]{14,} # Match minimum of 14 characters.
$ # Anchor to end of string.
/x';
这是 JavaScript 版本:
var re = /^(?=(?:.*?[A-Za-z]){6})(?=(?:.*?[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
附录 2012-11-30
我注意到这个答案最近得到了赞成票。这使用了一个更过时的表达式,所以我认为是时候用更好的表达式更新它了。
=== 更高效的表达式 ===
通过完全摆脱“点星”并贪婪地应用更精确的表达式(否定 char 类),一个更有效的解决方案结果:
$re = '/# Match 14+ char password with min 2 digits and 6 letters.
^ # Anchor to start of string.
(?=(?:[^A-Za-z]*[A-Za-z]){6}) # minimum of 6 letters.
(?=(?:[^0-9]*[0-9]){2}) # minimum of 2 numbers.
[A-Za-z0-9#,.\-_]{14,} # Match minimum of 14 characters.
$ # Anchor to end of string.
/x';
这是新的 JavaScript 版本:
var re = /^(?=(?:[^A-Za-z]*[A-Za-z]){6})(?=(?:[^0-9]*[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
- 编辑 1:将
#,.-_
添加到有效字符列表中。 - 编辑 2:将 greedy 更改为 lazy 星。
- 编辑 2012 年 11 月 30 日:添加了替代版本,其中“lazy-dot-star”替换为更高效的greedy应用更精确的表达式。
关于php - 字符串的正则表达式,必须至少包含 14 个字符,其中至少 2 个是数字,至少 6 个是字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527191/