我正在寻找我的问题时间和时间,但找不到一个正常的解决方案,或者可能是我的RegEx系列出了问题。我正在寻找不允许用户在密码中放入空格的部分。密码字段必须包含此正则表达式列表:
现在我已生成包含所有内容的RegEx行,但不包含带有空格的部分。如果有人知道这条线有什么问题,请纠正我并告诉我如何解决问题。顺便说一下,我试过[\ S]但不行,我不知道为什么。
我的RegExp专线:
^(?=(?:.*[A-Z]){1,})(?=(?:.*[a-z]){1,})(?=(?:.*\d){1,})(?!(?:.*[!@#$%^&*()\-_=+{};:,<.>]))(.{8,30})$
以下是使用此RegEx的有效和无效密码的完整演示:Demo
感谢所有回答并帮助我的人。
答案 0 :(得分:1)
正如其他人所说,你的规范非常薄弱 如果您 坚持 ,您可以提出以下表达式,该表达式使用相反的对:
^ # the beginning
(?=[^a-z]*[a-z]) # at least one lower case
(?=[^A-Z]*[A-Z]) # at least one upper case
(?=\D*\d) # at least one digit
[\da-zA-Z]{8,30} # digits and characters from a-z
$ # the end
<小时/>
在PHP
中,这将是:
<?php
$regex = '~
^ # the beginning
(?=[^a-z]*[a-z]) # at least one lower case
(?=[^A-Z]*[A-Z]) # at least one upper case
(?=\D*\d) # at least one digit
[\da-zA-Z]{8,30} # digits and characters from a-z
$ # the end
~x';
$password = "Someveryweakpassword123";
if (preg_match($regex, $password)) {
echo "Yes, it does";
}
?>
请参阅a demo on ideone.com 再一次,这些密码很容易猜到,并且使它更容易,你可以将它们存储为纯文本(但请在这里留下链接,以便其他人不在该网站上注册:)。
答案 1 :(得分:1)
我不知道您是如何尝试使用\S
的,但这正是您在主要消费模式中可以利用和代替.
的原因:
\A # Start of string
(?=[^A-Z]*[A-Z]) # Require at least one uppercase letter
(?=[^a-z]*[a-z]) # Require at least one lowercase letter
(?=\D*\d) # Require at least one digit
(?![^!@#$%^&*()\-_=+{};:,<.>]*[!@#$%^&*()\-_=+{};:,<.>]) # No special chars
\S{8,30} # Match 8 to 30 non-whitespace chars
\z # Unambiguous end of string.
请参阅regex demo(演示正则表达式有点不同,因为测试是针对多行字符串执行的,这是您应该使用的字符串。)
在这里,我在前瞻中使用了对比原理,并删除了不必要的非捕获组。
此外,使用\z
锚点来匹配字符串的结尾更安全,因为$
可以在字符串中的最后一行换行符之前匹配。