php 密码复杂度正则,如何在此“密码复杂度”正则表达式中使用下划线

这里是:

/(?=^.{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]).*$/

这是一个例子