这里是:
/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.
])(?=.*[A-Z])(?=.*[a-z]).*$/
仅在密码包含大写和小写字母以及1位数字或1个特殊字符的情况下通过,但是我希望下划线_也计为特殊字符,并且当前不包含此字符,如何修改此正则表达式,以便 下划线是否可以算作特殊字符?
编辑:这是上下文...
jQuery.validator.addMethod("complexity", function(value, element) {
return this.optional(element) || /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.
])(?=.*[A-Z])(?=.*[a-z]).*$/.test(value);
},"password is not complex, see requirements above");
引用著名的名言:"有些人遇到问题时,会想:"我知道,我会使用正则表达式。"现在,他们有两个问题。
是的,我完全同意你的观点,对我来说,好像有人吃了键盘然后把它倒了
"有些人面对正则表达式时会认为"我知道,我会用我记得的引人注目的行情"。 现在他们没有添加任何讨论。" – Tomalak
/(?=^.{8,}$)((?=.*\d)|(?=.*[\W_]+))(?![.
])(?=.*[A-Z])(?=.*[a-z]).*$/
aioobe已关闭[ W_]替换 W
请注意,这将空格视为特殊字符。
另外,我看不到您要在哪里检查数字。编辑:没关系,我找到了。 (复杂的正则表达式就像wheres waldo。)
这是一个不允许使用空格的简化版本(并且更易于维护)
(?=^.{8,}$)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])(?=^.*[^\s].*$).*$
^ ^ ^ ^ ^
| | | | L--does not contain a whitespace
| | | L--at least one non word character(a-zA-Z0-9_) or _ or 0-9
| | L--at least one upper case letter
| L--at least one lowercase Letter
L--Number of charaters
这些是你的基础
(?=.*[a-z]) // Whatever is inside the [] meens the string contains at least one charter inside that set.
// If you wanted a minimum of three lowercase letters you can chain the inner block like so
(?=(.*[a-z]){3,})
你是第一个这样做的,所以你明白了,就像一个魅力
说到这个空白,我该如何使它成为空白?
@Shogun我添加了更多的解释和没有空格的示例(但我看不到不允许的合法理由)
(?=^.*[^\s].*$)不排除空格,它只是确保至少有一个非空格字符。
@Alan Moore谢谢,我删除了不正确的部分。
非常感谢,您现在就在考虑,不妨允许
您的表情似乎都无法正常工作。例如。在PHP中,aaa1111aA作为有效密码传递,尽管它不包含任何特殊字符。我必须对此修改后一个,以正确捕获特殊字符:(?=^.{8,}$)(?=.*[a-z])(?=.*[A-Z])(?=.*[\d])(?=.*[\W_])(?=^.*[^\s].*$).*$
发现以下内容实际上不允许使用空格:(?= ^ [ S] * $)
@zvolkov将^用作集合([])中的第一个字符会反转结果集。是的,用[\S]代替[^\s]也可以,但是两种方法产生的结果相同。 (此外,如果您真的想挑剔,则表达式为(?=^\S*$))
@ScottChamberlain很好,我在regular-expressions.info/javascriptexample.html上都进行了测试,并且(?= ^ [ S] * $)可以工作,而(?= ^。* [^ s]。* $)却不能。感谢您解释正则表达式工具,它的神奇之处!
您要在一个正则表达式中执行所有这些操作的任何特定原因?在我看来,如果您将其分解,它将更具可读性:
if (password.length() < 8) return"Password too short!";
if (!password.matches("\d")) return"Password must contain at least one digit!";
if (!password.matches("[A-Z]")) return"Password must contain at least one uppercase leter!";
if (!password.matches("[a-z]")) return"Password must contain at least one lowercase leter!";
// Password is valid, save it, etc.
请参阅所做的编辑以了解原因,它已经通过这种方式实现了:)
@Shogun:为什么不将检查加入到函数中,然后只调用validate_complexity(value)而不是.test(value)?分解出来更易于维护和阅读
告诉我改变自己在做什么并没有回答我的问题
点头-我并不是想说你应该改变自己的工作,只是花点时间来确保你不在错误的地方看:)注意,我没有说"你不应该在这里使用RE!"。
您认为这是可接受的密码吗?
Aa8 ?y_
因为您的正则表达式与之匹配。您可能希望将第一个前瞻从(?=^.{8,}$)更改为(?=^[!-~]{8,}$),从而限制了打印ASCII字符(即非空白或控制字符)的可能性。如果要允许非ASCII字符,它将变得更加复杂。 JavaScript正则表达式不能很好地处理Unicode。
这是我写正则表达式的方法:
/^(?=[!-~]{8,}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[^A-Za-z]).*$/
像Scott一样,我看不到这一点:(?![.
])。它所做的只是确保第一个字符不是句号或换行符。那不可能是您(或原始作者)的意思,但我什至无法猜出实际意图是什么。
我想您的\W表示一个特殊字符(通常定义为"非单词字符")
因此,如果要将_添加到该字符集,则应该能够编写[\W_]。
(根据Scott Chamberlains的评论进行了更新。)
我不确定为什么会有(?![.
])。您要防止密码中包含换行符吗?
否则,这看起来像一个简化的正则表达式:
String regexp ="(?=^.{8,}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[\\W_\\d]).*$";
for (String s : new String[] {
"abcdefg",
"abcdefgh",
"abCdefgh",
"abc1efgh",
"abC1efgh",
"abC1e@gh",
"abC1e_gh"}) {
System.out.println(s +" is" + (s.matches(regexp) ?"ok" :"not ok"));
}
版画
abcdefg is not ok
abcdefgh is not ok
abCdefgh is not ok
abc1efgh is not ok
abC1efgh is ok
abC1e@gh is ok
abC1e_gh is ok
大多数正则表达式语言都将_视为charater常规单词expressions.info/charclass.html#shorthand
是的,我也想得太多,但是当我尝试时并没有算在内
[^ w_]不正确,它与[^ a-zA-Z0-9_]等效(请注意两个下划线),您想要的是[ W_],它与[^ a-zA-Z0-9_]等效| _
很酷,为您的努力提供了支持,但是另一个人首先放弃了这个,谢谢
对于将来的搜索者,这是我的实现,其中包括要求特殊字符和数字:
/(?=^[!-~]{8,}$)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?=^.*[^\s].*$)(?=.*[\d]).*$/
这是一个例子